Proloog “of” operator, vraag

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 oroperator. 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:

Predicate Control in Prolog

Other episodes