Prolog: das Finden der N-te Element einer Liste
Ich bin versucht, suchen das N-te element einer Liste in Prolog. Hier ist der code, den ich bin versucht zu verwenden:
Cells = [OK, _, _, _, _, _] .
...
next_safe(_) :-
facing(CurrentDirection),
delta(CurrentDirection, Delta),
in_cell(OldLoc),
NewLoc is OldLoc + Delta,
nth1(NewLoc, Cells, SafetyIdentifier),
SafetyIdentifier = OK .
Grundsätzlich bin ich versucht, zu überprüfen, ob eine gegebene Zelle ist "OK", um in zu bewegen. Bin ich etwas fehlt?
- nth1/3 - ist das zählen von "1" (nicht von "0" als üblich). Ist das dein problem? BTW, Sie versuchen, zu vereinheitlichen Sicherheit zu verschieben mit "OK". Das ist anders als "check". Die eigentliche "Prüfung" vielleicht in einem anderen Ort, die versuchen, zu vereinheitlichen, die mit Sicherheit nicht"OK", und du ' L gehen im backtracking.
- Ich fand heraus, dass aus welchem Grund auch immer NewLoc ist immer 0. Gibt es einen Grund das ist? Ich kann nicht scheinen, um es herauszufinden? Auch bin ich mir nicht sicher, ob ich verstanden habe, die zweite Hälfte Ihrer Antwort (nur Programmierung prolog für ein paar Tage).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Louis, ich bin nicht ganz klar, was Sie sind mit dem Ziel zu tun, mit diesem code, aber ein paar Anmerkungen, die vielleicht hoffentlich helfen.
Dinge, die beginnen mit einem Großbuchstaben in Prolog sind Variablen, die aufeinander abgestimmt werden gegen die in den Regeln.
_
ist ein spezielles symbol, das verwendet werden kann, anstelle der einen Variablen-Namen, um anzuzeigen, dass jeder Wert entsprechen kann.next_safe(_)
ist daher nur in der Lage ist, die Bereitstellung Sie mit einer wahr/falsch beantworten, wenn man ihm einen bestimmten Wert. Einer der großen Vorteile von Prolog ist die Fähigkeit, den vereinen gegen eine variable durch backtracking (wie ony gesagt). Dies würde bedeuten, dass, wenn richtig geschrieben, konnte man nur Fragen, Prolognext_safe(X).
und würde es wieder alle möglichen Werte (sicher bewegt), dass die Vereinigung mit X.Zurück zu gehen, um den ersten Punkt zu Großbuchstaben. Dies bedeutet, dass
OK
ist eigentlich eine variable warten aufeinander abgestimmt werden. Es ist tatsächlich eine leere box, die Sie versuchen zu entsprechen, gegen ein anderes leeres Feld. Ich denke, was Sie beabsichtigen, ist die Verwendung der Wertok
was anders ist. Sie weisen Sie nicht auf Variablen in der gleichen Weise, dass Sie in anderen Programmier-Stile. So etwas wie die folgenden, könnten Sie näher an das, was du suchst, aber ich bin mir noch nicht sicher, es ist Recht so wie es aussieht versuchen Sie zu ordnen Dinge, aber ich bin mir nicht sicher, wie Sie Ihrenth1
funktioniert.es ist ein predfined Prädikat genannt nth0 ..
index-Auflistung starten von 0
hoffe, das hilft ..