Prolog插入元素问题

时间:2016-02-21 23:31:32

标签: list prolog

所以我有Prolog代码在给定位置插入一个元素:

ins(Val, [H|List], Pos, [H|Res]):-
   Pos > 1,
   !, 
   Pos1 is Pos - 1, 
   ins(Val, List, Pos1, Res). 
ins(Val, List, 1, [Val|List]).

这给出了输出

28 ?- ins(B, [A,C,D], 4, Z).
Z = [A, C, D, B].

工作正常。

现在我想在列表的开头重用这段代码。

addFirst(Val, [H|List], [H|Res]):-
   ins(Val, [H|List], 1, [H|Res]).

这给了我一个输出

41 ?- addFirst(A, [B,C,D], Z).
A = B,
Z = [B, B, C, D].

有人可以帮助我为什么会这样吗?我是Prolog的新手。

3 个答案:

答案 0 :(得分:2)

这个错误是对H的过度分享...更简洁更好:这是有效的

addFirst(Val,List,Res):-
    ins(Val,List,1,Res).

答案 1 :(得分:0)

你应该看看第n [0,1] / 4:

 ?- nth0(3, R, z, [a,b,c] ).
R = [a, b, c, z].

这可能会有所帮助。

答案 2 :(得分:0)

您遇到的问题是您的代码没有正确反映您的意图。

addFirst(Value, List, Result) :-
   ins(Value, List, 1, Result).

如果您想要将值添加为列表的第一个,请将其插入位置1的列表中。这就是上述声明所说的内容以及所需的全部内容。

你注意到的错误源于两个错误。

第一个是addFirst的规则。

addFirst(Val,[H|List],[H|Res]):-
   ins(Val,[H|List],1,[H|Res]).

这表明两个列表的头部应该相同。换句话说,您有一个列表[H|List],您在第一个位置添加Val,并且您希望结果为[H|Res]。这种情况发生的唯一方法是,要添加的值是要添加到的列表的头部。

这是第二个错误发挥作用的地方。

41 ?- addFirst(A,[B,C,D],Z).
A = B,
Z = [B, B, C, D].

您使用的是大写字母。大写字母表示变量。因此,Prolog解释器尝试以一种使addFirst(A,[B,C,D],Z)为真的方式为这些变量赋值。正如我们刚刚看到的那样,这必然意味着列表的头部必须等于添加的值,因此A = B,这是回复的第一部分。第二部分是结果列表,它是列表(由变量组成!)[B, B, C, D]

如果您使用小写字母作为列表和新元素,则此查询将失败。

41 ?- addFirst(a,[b,c,d],Z).
No.