【发布时间】:2014-01-10 02:22:08
【问题描述】:
append([],U,U).
append([X|U1],U2,[W|U3]) :- **W = X** , append(U1,[X|U2],[I|Quyruk]) ,
**W = I**, U3 = Quyruk .
当我删除 "W is X" 时,此代码会附加前两个列表。
此代码包含不必要的变量,例如“W 是 X”,但它们与我的问题有关。
当我在 ":-" 和 ",append..." 之间将任何值设置为 "W" 时,例如 "W is X" 或 "W = 3" > 或 "W = 6" -- 返回 false。
为什么我不能在代码中的那个位置为 W 设置任何值,但我可以在代码末尾设置“W = I”?
查询是append([1,2],[3],U). 我想在这段代码中得到[2,1,3]
在append([1,2,3],[4,5,6],U). 我想得到[3,2,1,4,5,6]。
append([1],[2,3],U). 返回[1,2,3],当我取第一个列表“1”的长度时(当第一个列表只有一个元素时)代码是完美的;但是当我取第一个列表的长度 >1 时(当第一个列表有多个元素时)代码返回 false。
【问题讨论】:
-
为什么不直接:
my_append(L1, L2, L3) :- reverse(L1, L4), append(L4, L2, L3).?在序言中=不像其他语言那样分配。它统一。一旦通过统一实例化了变量,就不能在子句内更改它。因此,一旦您执行W = X,这将统一它们并且W = I将始终失败,除非I和X(I和W)碰巧用相同的值实例化。 -
追加([1],[2,3],U)。 -> 返回 [1,2,3] ,当我取第一个列表“1”的长度时(当第一个列表只有一个元素时)代码是完美的;但是当我取第一个列表的长度 >1 时(当第一个列表有多个元素时)代码返回 false
标签: prolog