2016-11-04 2 views
0

In Prolog habe ich eine Regel, die die Länge einer Liste berechnen. Ich frage mich, ob meine Liste vordefiniert ist, was mache ich?Prolog Länge vordefinierte Liste

zum Beispiel in der Basis I

list1[1,2,3,4,3,5,8]. 

longueur([],0). 
longueur([_|Y],N) :- longueur(Y,M), N is M+1. 

haben und in Prolog Ich trete longueur(list1,N). Ich halte Geting false.

+1

'li st1 [1,2,3,4,3,5,8] .' ist keine korrekte Syntax und bedeutet insbesondere nicht, dass "list1 = [1,2,3,4,5,6,7,8]" . – Fatalize

+0

aber ich bekomme keinen Fehler! – bttX

+1

Welche Distribution verwenden Sie? Auf SWI-Prolog erhalte ich wie erwartet folgenden Fehler: 'ERROR: c: /test.pl: 1: 5: Syntaxfehler: Operator erwartet '. – Fatalize

Antwort

0

longueur(list1,N). falsch ist, weil list1 keine Liste ist, und so paßt nicht mit irgend der beiden Regeln von longueur/2, die Sie geschrieben haben.

es an die Arbeit, das ist, was Sie tun würden:

?- list1(X), longueur(X,L). 
X = [1, 2, 3, 4, 3, 5, 8], 
L = 7. 

Wenn Sie longueur/2 wollen mit list1 als Argument arbeiten, und mit list1([1,2,3,4,5,6,7,8]). als Tat, sollten Sie ein Prädikat wie longueur_depuis_atome/2 erstellen:

longueur_depuis_atome(A, L) :- 
    call(A, X), 
    longueur(X, L). 

Dann:

?- longueur_depuis_atome(list1,L). 
L = 7. 
+0

jetzt verstehe ich dich. Im Prolog sollte ich die Liste also in eine Variable einfügen. danke – bttX

+0

Es hat funktioniert. aber ich habe longueur_depuis_atome nicht verstanden. Können Sie mir das bitte etwas genauer erklären? – bttX

+0

@bttX 'call (A, X)' ergibt dasselbe wie wenn Sie 'A (X)' in den Interpreter schreiben würden (aber es funktioniert natürlich für jeden Wert von 'A'). Wenn also "A = list1" ist, ist "call (A, X)" das gleiche wie wenn du "list1 (X)" geschrieben hättest, was bedeutet, dass "X = [1,2,3,4,5,6 , 7,8] 'durch Mustervergleich. Dann rufen wir 'longueur/2' auf, weil wir das so wollen ... – Fatalize