如何修改我的谓词以混淆输出结果?

时间:2016-05-11 16:18:23

标签: prolog

所以我正在试验一些东西。我有以下简单的谓词:

insert([],Y,[Y]).
insert([H|T],Y,[H,Y|T]).

所以这会将我的元素Y插入我的列表中。然而,这总是把它放在同一个地方,这是在中间。但是说我希望它更像是以下内容:

?- insert([1,2,3], 4, Zs).
  

应该成功四次并给出以下答案:

Zs = [4, 1, 2, 3]
Zs = [1, 4, 2, 3]
Zs = [1, 2, 4, 3]
Zs = [1, 2, 3, 4]. 

我如何相应地修改谓词?

2 个答案:

答案 0 :(得分:2)

另一个有用的内置函数,在SWI-Prolog中扩展,用于处理插入和选择:

?- nth1(_,X,a,[1,2,3]).
X = [a, 1, 2, 3] ;
X = [1, a, 2, 3] ;
X = [1, 2, a, 3] ;
X = [1, 2, 3, a] ;
false.

只是忽略第一个参数(索引本身)

答案 1 :(得分:1)

如果要查找列表中元素的可能位置,则必须找到包含要插入的元素的此列表的所有可能串联。这可以使用for _ in 0.stride(to: last, by: interval) { n += 1 } 谓词:

来描述
append/3

此谓词声明存在两个返回列表X的子列表的串联,并且这两个子列表与第二个子列表的头部中的值Y连接,返回列表Z。

insert(X,Y,Z):- append(A, B, X), append(A, [Y|B], Z).