2012-11-22 21 views
15

Pracuję nad prologiem, którego jestem nowy.Prolog "lub" operator, zapytanie

szukam dla operator "lub"

registered(X, Y), Y=ct101, Y=ct102, Y=ct103. 

Oto moje zapytania. Co chcę napisać jest kod, który będzie:

„powrót X, zważywszy, że Y jest równa wartości Z lub wartości Q lub wartość P”

Pytam go do powrotu X czy Y jest równa wszystkie 3 jednak. Co tu jest operator? Czy jest jeden?

Odpowiedz

9

można „wywołać” alternatywne wiązania na Y ten sposób:

...registered(X, Y), (Y=ct101; Y=ct102; Y=ct103). 

Uwaga nawiasy są wymagane, aby utrzymać prawidłowy przepływ sterowania wykonaniem. ;/2 to ogólny operator or. Dla Państwa ograniczonego użytkowania mogłeś także wybór bardziej idiomatyczne

...registered(X, Y), member(Y, [ct101,ct102,ct103]). 

że na backtracking wiąże Y do każdy członek listy.

edycja Zrozumiałem z opóźnieniem twoje ostatnie wymaganie. Jeśli chcesz, aby mecz Y wszystkie 3 Wartości te lub jest nieodpowiednie, użyj zamiast

...registered(X, ct101), registered(X, ct102), registered(X, ct103). 

lub bardziej kompaktowy

...findall(Y, registered(X, Y), L), sort(L, [ct101,ct102,ct103]). 

findall/3 build lista w tej samej kolejności, że zarejestrowany/2 kończy się sukcesem. Następnie używam sortowania, aby zapewnić dopasowanie.

...setof(Y, registered(X, Y), [ct101,ct102,ct103]). 

setof/3 sortuje także na liście wyników

+0

Dzięki, pomogło tonę. Nie wiedziałem, jak sobie z tym poradzić, ale mam zamiar przeczytać o wiązaniach i wycofywaniu. Doceniony! – Eogcloud

23

Właśnie inny punkt widzenia. Wykonywanie „lub” w Prologu mogą być również wykonane z „dysjunktywnej” operatora lub średnikiem:

registered(X, Y) :- 
    X = ct101; X = ct102; X = ct103. 

Dla pełniejszego wyjaśnienia:

Predicate control in Prolog