只需要一個簡單的解釋..試圖把所有東西都拼湊在一起。字符串操作的簡單序言解釋
lastitem([X|Xs],Out) :- lastitem(Xs,Out).
這裏是trace:lastitem([a,b,c],X)。
[trace] 8 ?- lastitem([a,b,c],X).
Call: (6) lastitem([a, b, c], _G536) ? creep
Call: (7) lastitem([b, c], _G536) ? creep
Call: (8) lastitem([c], _G536) ? creep
Exit: (8) lastitem([c], c) ? creep
Exit: (7) lastitem([b, c], c) ? creep
第1步說,如果lastitem(東西,somethign)存在,那麼listem([X |兩個X],輸出] ..所以A被切出 步驟2-3不相同..但瓦特/。 B和C. 現在的問題是發生了什麼瓦特/步空列表4? 爲什麼空單不履行lastitem(XS,輸出)?還是我解決不正確?
而且回溯的口頭解釋將幫助..因爲在追加我真的扭曲。附加沒有目標來解決之間的步驟..但反向沒有..也沒有我的答案上面..如果你跟蹤它,你可以看到X變量總是在相反或本例中相同結束它的變化。
append([],L,L).
append([H|T],L2,[H|L3]) :- append(T,L2,L3).
append([a, b, c], [1, 2, 3], _G518) % <-- variable L3 continues to change
append([b, c], [1, 2, 3], _G587) % <-- same
append([c], [1, 2, 3], _G590) % < -- same
append([], [1, 2, 3], _G593) % <-- same
append([], [1, 2, 3], [1, 2, 3])
append([c], [1, 2, 3], [c, 1, 2, 3])
append([b, c], [1, 2, 3], [b, c, 1, 2, 3])
append([a, b, c], [1, 2, 3], [a, b, c, 1, 2, 3])
X = [a, b, c, 1, 2, 3]
其實你是對的。我在我的代碼看起來漲的,看見:lastitem([],[]) 。 lastitem([OnlyOne],OnlyOne)。所以我有一個空案和一個單例案..這解釋了我的問題.. thanx指出我愚蠢的錯誤.. – DJPlayer 2011-05-01 17:07:07