Bestimmen, ob eine Liste leer ist oder nicht
Ich will ein paar if | else Sachen in prolog. Unten ist mein code, Prolog zurück '- R = false' wenn mein input-Liste nicht leer ist, wird es wieder "falsch", wenn meine Liste ist leer. Was vermisse ich?
Code:
isEmpty([H|T],R) :-
length([H|T],L),
( L > 0 -> R = 'false'
;
L =:= 0 -> R = 'true'
).
Prolog Ausgabe:
1 ?- isEmpty([],R).
false.
2 ?- isEmpty([1],R).
R = false.
3 ?- isEmpty([1,2,3],R).
R = false.
Alles, kann behandelt werden, die durch pattern matching sollte behandelt werden, indem Sie pattern-matching. Sie brauchen nicht
Bitte beachten Sie, dass im Prolog, es ist selten, tatsächlich weisen Sie 'true' oder 'false' zu nichts. Viel häufiger ist es einfach gelingen, oder scheitern. Also code: isEmpty([]). wäre das ganze Programm.
Dies bedeutet, dass alles, was nicht
Ich sehe wirklich nicht, was du meinst, durch irreführende. Vorausgesetzt, dies sollte nur verwendet werden für Listen, [] leer ist, und alles andere ist nicht. Wer würde eine Methode namens " isEmpty() ohne zu wissen, was er redet?
if-then-else
überhaupt die Unterscheidung zwischen den Fällen.Bitte beachten Sie, dass im Prolog, es ist selten, tatsächlich weisen Sie 'true' oder 'false' zu nichts. Viel häufiger ist es einfach gelingen, oder scheitern. Also code: isEmpty([]). wäre das ganze Programm.
Dies bedeutet, dass alles, was nicht
[]
wäre eine nicht-leere Liste, die irreführend sein kann: schließlich wissen wir nicht wirklich (aus der Frage), wie diese verwendet werden soll, oder wie könnte jemand entscheiden, es zu benutzen, bevor man begreift, was es tatsächlich bedeutet.Ich sehe wirklich nicht, was du meinst, durch irreführende. Vorausgesetzt, dies sollte nur verwendet werden für Listen, [] leer ist, und alles andere ist nicht. Wer würde eine Methode namens " isEmpty() ohne zu wissen, was er redet?
InformationsquelleAutor zihaow | 2016-02-18
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen Weg zu definieren, dies würde die Vereinigung ("pattern matching"):
Wenn Sie darauf bestehen, mit einer if-then-else, Sie müssen übergeben Sie die Liste ohne versucht, es in irgendeiner Weise:
... aber das ist nicht optimal. Die beiden Prädikate Verhalten sich identisch, wenn das erste argument ist in der Tat eine Liste:
Jedoch etwas ärgerlich passiert, wenn das erste argument nicht Boden (das ist, ist nicht vollständig instanziiert):
Also versuchen wir zu Fragen, für eine leere Liste, und wir bekommen es; jedoch, Prolog besteht darauf, es könnte eine andere Antwort. Wenn wir versuchen, es zu bekommen, bekommen wir einen Fehler.
(Extra credit: herausfinden, was passiert!)
Dem Prädikat
list_empty/2
ist nicht perfekt, entweder. Bedenken Sie:Dies gelingt, und wir interpretieren könnte, die Antwort: "Die Liste
[_|a]
ist nicht leer". Dies ist jedoch nicht immer ein die richtige Liste!Mit
length/2
ist überhaupt nicht eine schlechte Idee. Wir können es verwenden, um schreiben Sie ein Prädikat, das ist wohl ein bisschen mehr nützlich, alslist_empty/2
. Ich nenne eslist_nonempty/2
verwechseln Sie die situation:length/2
tut viel mehr als nur das finden der Länge einer Liste. Es kann verwendet werden zum generieren von Listen von Zunehmender Länge, oder überprüfen Sie, ob das erste argument ist die korrekte Liste:SWI-Prolog wirft einen Fehler, wenn
length/2
ist nicht gegeben eine Liste. Implementierungen, die mehr verpflichtet, ISO-compliance scheitern soll, statt. Mit GNU-Prolog:Ich wollte eine 15 min Pause und dachte dies ist eine einfache genug Frage. Ich wusste, ich würde aus aufgerufen werden. Ich werde versuchen zu erarbeiten.
Ich hab es tatsächlich mehr ins detail gehen. Ich Frage mich, ob dies besser ist, als es vorher war.
InformationsquelleAutor
Ich weiß, es ist altes Thema, aber noch könnte dies nützlich sein für diejenigen, die sich mit SWI-Prolog. Stattdessen definieren Ihre eigenen Regeln, die Sie ausprobieren können:
Es wird verwendet, um das erste element auf der Liste, die im Falle der leeren Liste einfach nicht.
InformationsquelleAutor Jacek
Da Sie nur den Umgang mit den Listen der form
[H|T]
Ihre Klauseln wird nur für Listen mit mindestens einem element in der Liste. In anderen Worten, Sie erhalten die Antwortfalse
für die leere Liste, weil es nicht eine matching-Klausel - nicht, weil die Länge 0 ist.InformationsquelleAutor Dirk Herrmann