只需要一个简单的解释..试图把所有东西都拼凑在一起。字符串操作的简单序言解释
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