2016-05-21 12 views
0

Oberhalb der Rückkehr wahr, aber es gibt keine X zurück. Warum?Abwicklungsliste in Prolog

+0

Es vereinheitlicht 'X' nicht mit irgendetwas, weil Ihr zweites Argument zu' unwindHead' * singleton * ist (Sie haben die Warnmeldung gesehen, richtig?). Das bedeutet, dass Sie eine Variable haben, die Sie nur an einer Stelle verwenden und daher mit einem Wert kombiniert wird, der niemals verwendet wird, oder nie mit einem Wert vereinheitlicht wird. – lurker

+0

ok, wie verbessert man das? Ich habe versucht, es auf der rechten Seite zu verwenden, aber das Ergebnis ist das gleiche :( – Gilgamesz

+0

Ehrlich gesagt bin ich nicht genau sicher, was dieses Prädikat im Allgemeinen tun soll. – lurker

Antwort

1

Was Sie haben, ist sehr nah, und ich denke, Sie sind nur in der Prolog verdreht. Sie müssen es nur logisch aufschlüsseln und dann auf den Prolog schauen. Richtig denken Sie in Bezug auf den Fall, ob das erste Element in der Liste selbst eine Liste ist. Schreiben Sie heraus, was die Regeln aussehen könnte:

  1. Wenn wir „entspannen“ [E|_] und E keine Liste ist, dann bekommen wir E.
  2. Wenn wir "[E|_] und E10" eine Liste "abwickeln", dann wir (rekursiv) "E" abwickeln, um das Ergebnis zu erhalten.

Welche aussehen würde:

unwind_head([E|_], E) :- \+ is_list(E). 
unwind_head([E|_], F) :- is_list(E), unwind_head(E, F). 

Sie können auch den Prolog verwenden "if-else" für dieses Konstrukt:

unwind_head([E|_], F) :- 
    ( is_list(E) 
    -> unwind_head(E, F) 
    ; F = E 
    ). 

Beachten Sie, dass wir nie, was den Schwanz von der Pflege Liste ist, so können wir _ verwenden.

+0

Danke :). 1. Ist es möglich, den Suchbaum in Prolog zu drucken? 2. Ist es möglich, Schritt für Schritt zu debuggen? 3. Jeder kann ersetzt werden durch die Konstruktion beschrieben durch das erste Beispiel in Ihrer Antwort, bin ich richtig? – Gilgamesz

+0

@Gilgamesz Sie können 'trace' verwenden, um Schritt für Schritt zu debuggen. Es wird jedoch keinen Suchbaum gedruckt. Sie müssen das mit der Hand machen. – lurker