ich Prolog lerne und ich habe in den Code stecken, wo die Wissensbasis und Grundregeln sind:Prolog Rekursion funktioniert nicht in die andere Richtung
rectangle(a1, 3, 5). %Name,Width,Height
rectangle(a2, 1, 2).
rectangle(a3, 4, 3).
calcWH(T,C) :-
rectangle(T,W,_), C is W. % finds the width of the rect.
Der rekursive Teil ist:
calcWTH([],0). % Base case
calcWTH([H | T ] ,K) :-
length([H|T],L),
L =< 3,
calcWTH(T,M),
calcWH(H,O),
K is O+M.
Was ich mit diesem Code machen möchte, ist, mit calcWTH möchte ich die Gesamtbreite der Liste der Rechtecke berechnen. Zum Beispiel
calcWTH([a1,a2,a3],A)
gibt 8 zurück, wie erwartet. Die Sache, die mich irritiert, ist, dass dieser Code nur für den einen Weg funktioniert, nicht für den anderen. Zum Beispiel, wenn ich mache eine Abfrage wie
calcWTH(A,3)
Es findet zunächst A = [A1], dann A = [a2, a2, a2] und danach erwarte ich das Programm wegen des Teils zu stoppen length([H|T],L), L =< 3
Aber es gerät auf unbestimmte Zeit in eine Schleife. Was fehlt mir hier?
'C ist W' überflüssig ist. Setzen Sie einfach 'calcWH (T, W): - Rechteck (T, W, _) '(wenn Sie ausführlicher sein wollten, sollten Sie Vereinheitlichung verwenden,' C = W' nicht Ausdruck Auswertung 'C ist W'). Auch wenn Sie über Ganzzahlen gehen, wenn Sie möchten, dass etwas "anders funktioniert", sollten Sie CLP (FD) statt "is/2" verwenden, also "K # = O + M". – lurker