Ich habe den folgenden Code: Beachten Sie, dass, während dieser Code auf Listen funktioniert, diese Listen Sätze darstellen, also sollten [1,1,2,2,3,3] und [1,2,3] gleichwertig sein .Warum funktioniert dieses Prolog-Prädikat?
%contains(L1, L2), returns true if L1 contains L2
contains(_, []).
contains(L1, [Head|Tail]) :- member(Head, L1), contains(L1, Tail).
%equals(L1, L2), returns true if L1 is equal to L2
equals([X|L1],[X|L2]) :- equals(L1, L2).
equals(L1, L2) :- contains(L1, L2), contains(L2, L1).
Die Idee ist, dass equals ([1,2,3], [1,2,1,3]) wahr zurückgeben sollte. Auf der Grundlage der obigen Definition ist jedoch Folgendes zu erwarten:
- equals ([1,2,3], [1,2,1,3]) entspricht der ersten Regel und wird aufgerufen gleich ([2,3], [2,1,3]]).
- gleich ([2,3], [2,1,3]]) stimmt mit der zweiten Regel überein und enthält enthält ([2,3], [2,1,3]), enthält ([2,1 , 3], [2,3]).
- enthält ([2,3], [2,1,3]) ausfällt, und gleich kehrt Nr
Und es aber immer noch funktioniert. Und auch andere Versuche, es zu verwirren. Kann mir bitte jemand das erklären?
(Prolog Umsetzung: SWI-Prolog Version 2.7.12)
Eigentlich ist dies das erste Prolog-Programm (oder genauer gesagt: Hausaufgabe), an dem ich je gearbeitet habe, also bin ich nicht wirklich weit gekommen. Ich bin ein kompletter Anfänger. Wie auch immer, danke, dass du es mir erklärt hast. –