GNUProlog retourneert alleen een van de waarden voor een query

% facts
mother(john, dana).
father(john, david).
mother(chelsea, dana).
father(chelsea, david).
mother(jared, dana).
father(jared, david).
% queries
parent(X,Y) :- father(X,Y);mother(X,Y).

Wanneer ik typ "parent (john, X).", Krijg ik X = dana, maar niet X == david. Echter, op mijn vorige vraag lijkt de persoon die op mij reageerde beide ouders te krijgen . Is dit een beperking van gprolog of doe ik nog steeds iets verkeerd?

2
thanos, hoe los ik dit probleem op? -edit- Moet ik alle moeders op een rij schrijven, en dan alle vaders op een rij?
toegevoegd de auteur gibsonfirebird12, de bron
retourneert het eerst X = dana? Dat is vreemd. tussen haakjes, je zou waarschuwingen als deze in gnu-proloog moeten krijgen: "waarschuwing: niet-aangrenzend predicaat moeder/2-clausule genegeerd"; dat is omdat de clausules van moeder/2 (en vader/2) niet gegroepeerd zijn, dus gnu-proloog negeert ze (tenminste vs 1.3)
toegevoegd de auteur Thanos Tintinidis, de bron
yup, schrijf elke clausule van het predikaat onder de andere (moeder (john, dana). moeder (chelsea, dana).).
toegevoegd de auteur Thanos Tintinidis, de bron

2 antwoord

Om alle resultaten te krijgen, druk je één keer voor elke oplossing op de puntkommonknop ; .

Als u alle resultaten als een lijst wilt zien, kunt u het proberen

?- findall(X, parent(john, X), L).

L = [david,dana]
5
toegevoegd
Bedankt gusbro. Ik heb de puntkomma niet opgevangen. Is er hoe dan ook om mijn vereniging automatisch alle waarden te laten rapporteren?
toegevoegd de auteur gibsonfirebird12, de bron
Bedankt gusbro. Kun je een goede hulpbron aanbevelen om dit te doen? Ik heb veel problemen met het vinden van bronnen voor prolog online.
toegevoegd de auteur gibsonfirebird12, de bron
De ; is een typische proloogconventie die wordt gebruikt op het hoogste niveau (waar u uw zoekopdrachten uitvoert). Als u alle oplossingen die u kunt schrijven wilt afdrukken, volgt u een eenvoudige procedure die het resultaat bindt, deze afdrukt en vervolgens de volgende oplossing niet krijgt.
toegevoegd de auteur gusbro, de bron
Je kunt het doen met het ingebouwde predicaat forall/2: forall (parent (john, X), (write (X), nl)). . Zoek ook op deze site naar naslagwerken over prologs. Er zijn hier enkele vragen die deze aanpakken.
toegevoegd de auteur gusbro, de bron

In de interactieve antwoordvraag op het hoogste niveau krijg je een volgende oplossing door de puntkomma ";" te typen.

Je voorbeeld werkt prima in GNU Prolog:

GNU Prolog 1.4.0
By Daniel Diaz
Copyright (C) 1999-2011 Daniel Diaz
| ?- [user].
compiling user for byte code...
mother(john, dana).
father(john, david).
parent(X,Y) :- father(X,Y);mother(X,Y).

user compiled, 4 lines read - 725 bytes written, 33109 ms

(2 ms) yes
| ?- parent(john,X).

X = david ? ;

X = dana

yes

doei

2
toegevoegd