所以我正在试验一些东西。我有以下简单的谓词:
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].
我如何相应地修改谓词?
答案 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).