2017-10-24 1 views
1

Ich versuche zu ermitteln, welche Implementierung von Mitglied effizienter ist, indem Sie die Back-Chaining-Prozedur von beiden zeichnen.Prolog Standard Mitglied/2 vs Mitglied/2 implementiert mit append?

Standardimplementierung:

isMember(X,[X|Tail]). 
isMember(X,[H|Tail]) :- isMember(X,Tail). 

Anfügen Umsetzung: (Aus meiner Klasse Noten)

appendMember(X,List). 
appendMember(X,List) :- myAppend(List1,[X|List2],List). 

myAppend([],List,List). 
myAppend([H|List1],List2,[H|Result]) :- myAppend(List1,List2,Result). 

Wenn ich den Tracer auf TK Eclipse erhalte ich die erwartete Ausgabe für die Standard-Implementierung mit der rekursiven ruft auf, aber die Append-Implementierung wird sofort erfolgreich beendet.

Ich frage mich, warum das ist und wie man die Back-Chaining-Verfahren für die Append-Methode zu zeichnen.

Vielen Dank im Voraus!

+1

Noch effizienter ist ['memberd/2'] (https://stackoverflow.com/a/21971885/772868) – false

Antwort

2

appendMember(X,List). ist sofort zufrieden, egal was Sie für die 2 Argumente haben, da sie nicht verbunden sind, uninstantiated Variablen.

Als solche denke ich, dass Sie es entfernen sollten.

+0

Danke! Ich schaute es mir an und überlegte, wie ich überhaupt den Back-Chaining-Prozess starten sollte? Sobald ich es entfernt habe, zeigt der Tracer deutlich, was passiert. – Ruhe

+0

Sorry, aber wissen Sie, welche wäre effizienter für eine große Liste? Beide scheinen die gleiche Anzahl an Schritten für meinen Testfall zu machen ... Mitglied (p, [d, f, p, r]). – Ruhe

+0

@Ruhe, SWI-Prolog hat einige Prädikate für [Laufzeitstatistiken erhalten] (http://www.swi-prolog.org/pldoc/man?section=statistics). – lurker