Stellen Prolog Rückkehr eine Lösung und beenden Sie die Anzeige der Abfrage-option
Ich bin neu in prolog und am Experimentieren mit, wie man es halt Abfragen nach findet er eine Antwort. Ich bin mit diesem code:
member1(L,[L|_]).
member1(L,[_|RS]) :- member1(L,RS),!.
Ist das Ergebnis:
| ?- member1(3,[3,2,3]).
true ? a
yes
Ich bin verloren, wie ich bekommen konnte, Prolog zu stoppen, drucken "true ?" und drucken Sie einfach "ja" statt. Ich habe versucht, mit if/else-Konstrukt-und die format-Funktion, aber es immer noch gibt "true ?". Irgendwelche Ideen?
- Sie wollen einfach nur eine Antwort? eine
true
? True bedeutet, dass die 3 ist ein Mitglied der Liste [3,2,3]. Der zweite wahr ist, dass die Abfrage fand es wieder in der Liste. ` member1(2,[3,2,3]).` geben würde, Sie nur eine wahr. - Wenn Sie die EINGABETASTE drücken, nachdem die erste true (statt
;
), es würde aufhören, backtracking
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie schneiden der falschen Stelle. Schneiden Sie nach dem Basis-Bedingung, die sagt, "wenn die Basis getroffen wird, nicht backtrack mehr":
Wenn-dann nicht für mich arbeiten, vielleicht haben Sie realisiert es anders? (auf swi-prolog)
Swi hat auch das Prädikat
once/1
.bearbeitet, um für die Fehler hingewiesen, die durch falsche.
Aus der Ausgabe, die Sie zeigen, ich nehme an, dass du mit GNU Prolog. Aber, zuerst eine wichtige Bemerkung:
Den Schnitt, die Sie nicht schneiden, wie Sie wollen es! In der Tat, es gar nicht verhindern, dass es eine einzige Antwort. Hier ist ein Beweis dafür:
So haben Sie immer noch zwei Antworten. Als Faustregel gilt: ein Schnitt nach einer rekursiven Ziel oft einige unerwartete Dinge.
Wenn Sie darauf bestehen, genau die erste Antwort, einfach sagen
once(member(X,[1,2,3]))
. Dieonce/1
ist effektiv geschnitten, auch, aber ganz in der Verkleidung. Es ist gezähmt zu tun genau eine Sache. Ja, Sie können auch Schnitte in den rekursiven Regeln, aber für einen Anfänger besser verlassen, dass zu einem späteren Lektion.Hinter all diesem gibt es einen anderen Punkt, der weniger sichtbar ist: Die toplevel-shell der GNU-Prolog Fragen Sie nach weiteren Lösungen, wenn es sieht, eine offene alternative (jargon: choicepoint). Also, wenn GNU fragt Sie mehr, Sie weiß, dass ein Teil noch nicht erforscht, aber es gibt keine Garantie, dass es eigentlich eine andere Antwort:
Hier die toplevel sieht eine offene choicepoint und so fragt Sie, ob Sie möchten, erkunden Sie die Abfrage nicht weiter. Ach, diese Suche ist in Vene...