Ik werk aan een proloog waar ik nieuw ben.
Ik ben op zoek naar een “of”-operator
registered(X, Y), Y=ct101, Y=ct102, Y=ct103.
Hier is mijn vraag. Wat ik wil schrijven is code die:
“retourneer X, aangezien Y gelijk is aan waarde Z OF waarde Q OF waarde P”
Ik vraag het om X te retourneren als Y echter gelijk is aan alle 3. Wat is de of operator hier? Is er een?
Antwoord 1, autoriteit 100%
je kunt op deze manier alternatieve bindingen ‘aanroepen’ op Y
:
...registered(X, Y), (Y=ct101; Y=ct102; Y=ct103).
Houd er rekening mee dat de haakjes nodig zijn om de juiste uitvoeringscontrolestroom te behouden. De ;
/2 is de algemene or
operator. Voor uw beperkte gebruik kunt u net zo goed de meer idiomatische kiezen
...registered(X, Y), member(Y, [ct101,ct102,ct103]).
dat bij teruggaan Y bindt aan elklid van de lijst.
bewerkenIk heb met enige vertraging uw laatste eis begrepen. Als u wilt dat Y overeenkomt met alle3 waarden, of ongepast is, gebruikt u in plaats daarvan
...registered(X, ct101), registered(X, ct102), registered(X, ct103).
of de compactere
...findall(Y, registered(X, Y), L), sort(L, [ct101,ct102,ct103]).
findall/3 bouwt de lijst op in dezelfde volgorde waarin geregistreerd/2 slaagt. Dan gebruik ik sort om de overeenkomst te verzekeren.
...setof(Y, registered(X, Y), [ct101,ct102,ct103]).
SETOF / 3 Sorteert ook de lijst met resultaten
Antwoord 2, Autoriteit 174%
gewoon een ander gezichtspunt. Het uitvoeren van een “of” in PROLOG kan ook worden gedaan met de operator of semi-col disjunct “:
registered(X, Y) :-
X = ct101; X = ct102; X = ct103.
Voor een vollediger uitleg: