2011-05-01 51 views
0

只需要一個簡單的解釋..試圖把所有東西都拼湊在一起。字符串操作的簡單序言解釋

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] 

回答

0

就像你一樣,我對lastitem缺少一個基本案例感到困惑。你確定它沒有被定義爲

lastitem([X|[]], X). 
lastitem([X|Xs],Out):- lastitem(Xs,Out). 

或類似的東西嗎?


至於所有的回溯,嘗試在查看Prolog代碼時不要過於強制性地考慮。 例如,追加可以「翻譯」到一個更常用的功能定義:

function append(xs, ys) = 
    if xs is [] then 
     return ys 
    else 
     let [H|L] = xs 
     return [H | append(L, ys)] 

Unterstanding這走一段很長的路要走,以瞭解Prolog的版本:)

+0

其實你是對的。我在我的代碼看起來漲的,看見:lastitem([],[]) 。 lastitem([OnlyOne],OnlyOne)。所以我有一個空案和一個單例案..這解釋了我的問題.. thanx指出我愚蠢的錯誤.. – DJPlayer 2011-05-01 17:07:07

0

lastitem([X|Xs],Out) :- lastitem(Xs,Out).,雙方的第二個參數是Out,所以它必須保持不變。

append([H|T],L2,[H|L3]) :- append(T,L2,L3).,左側第三個參數是[H|L3],但右側是L3,所以當你打電話append,你有一個「變量」爲[H|L3],但L3變量必須是不同的。像_G536這樣的變量名是全局的,所以當它們代表不同的東西時,它們必須是不同的。

(對不起,不精確的術語,我還沒有和Prolog的工作了一段時間。)