2016-03-19 12 views
0

Ich habe vor kurzem angefangen zu lernen Prolog und habe ein Problem festgestellt.Abfrage zurück, true/false

Nachfolgend wurde in Prolog geladen:

likes(john, apple). 
likes(john, pear). 
likes(john, grapes). 
likes(bill, mango). 
likes(bill, apple). 

ich ein Prädikat all_like(What, List) schreibe, die True, wenn alle Menschen in List wie die Frucht in What zurückkehren.

ZB:

all_like(apple,[john, bill]). 

zurückkehren sollte:

true ; 
false. 

all_like(grapes,[john, bill]).

zurückkehren sollte:

false. 

ich den folgenden Code haben:

all_like(What,List) :- check_list(What,List). 

check_list(What,[]) :- write('true'). 
check_list(What, [X|Rest]) :- likes(X,What), check_list(What,Rest). 
check_list(What, [X|Rest]) :- \+ likes(X,What), write('false'). 

Meine Ergebnisse sind:

erste Abfrage

true 
true . 

2. Abfrage

false 
true . 

jemand wissen würde, warum ich diese Ergebnisse bekommen werde?

Welche Bedeutung hat der zweite boolesche Wert?

Schließlich erscheint die . nach einem Raum von Bedeutung?

Vielen Dank für Ihre Hilfe.

Antwort

2

Prolog zeigt bereits, ob ein Prädikat gelingt (true oder yes) oder nicht (false oder no), so dass Sie zu viel Arbeit in Ihrem Prädikat tun, wenn Sie (a) explizit schreiben „true“ auf Erfolg, und (b) Sie versuchen, in einem Fehlerfall erfolgreich zu sein und Fehler zu schreiben. Es ist am besten, wenn der Fehler nur fehlschlägt, dann zeigt Prolog den Fehler an.

Nebenbei ist Ihr check_list Prädikat überflüssig und Sie können einfach all_likes verwenden. Also das ist wirklich alles, was Sie brauchen:

all_likes(_, []).    % An empty list likes anything 
all_likes(What, [X|Rest]) :- % All of [X|Rest] likes What if... 
    likes(X, What),   % X likes What and... 
    all_likes(What, Rest). % All of Rest likes What 

In SWI Prolog, können Sie diese Ergebnisse sehen werden:

?- all_likes(apple,[john, bill]). 
true ; 
false. 

?- all_likes(grapes,[john, bill]). 
false. 

In GNU Prolog, sieht die Ausgabe wie folgt aus:

| ?- all_likes(apple,[john, bill]). 

true ? ; 

no 
| ?- all_likes(grapes,[john, bill]). 

no 
| ?- 
+0

Dank lurker, das macht viel mehr Sinn. Darf ich fragen, warum 'false' nach' true; 'im ersten Beispiel angezeigt wird? –

+2

@Giri "false" wird nach "true" angezeigt, weil Prolog einen Auswahlpunkt hatte, zu dem er zurückgehen und nach weiteren Lösungen suchen kann, aber keine zusätzlichen Antworten gefunden hat. Also gibt SWI Prolog "false" aus. Sie können im GNU-Prolog-Fall sehen, dass Sie "nein" statt "falsch" erhalten, und es bedeutet dasselbe: keine Lösungen mehr. – lurker

Verwandte Themen