2011-05-01 26 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的工作了一段时间。)