prolog - 替换 Prolog 中列表的元素

标签 prolog

我有一个谓词 variablize/3它接受一个列表并依次用一个变量替换每个项目,例如:

% ?- 变量化([a,b,c], X, L).
% L = [[X, b, c], [a, X, c], [a, b, X]]

现在我试图扩展这个谓词以接受变量列表,例如:

% ?- 变量化([a,b,c], [X,Y], L).
% L = [[X, Y, c], [X, b, Y], [a, X, Y]]

到目前为止我的代码是:

替换_at([_|尾], X, 1, [X|尾])。
replace_at([Head|Tail], X, N, [Head|R]) :- M 是 N - 1, replace_at(Tail, X, M, R)。

replace_each([], _, _, [], _)。
replace_each([_|Next], Orig, X, [Res|L], N) :-
replace_at(Orig, X, N, Res),
M是N+1,
replace_each(Next, Orig, X, L, M)。

变量化(I,X,L):-replace_each(I,I,X,L,1)。

任何指针?我是否延长 replace_at/4有一个应该跳过的索引列表?

最佳答案

一种简化的、基于内置的实现方式 variablize/3

variablize(I, X, L) :-
    bagof(R, U^select(U, I, X, R), L).

提供证据,而不是 select/4 我们可以有一个distribute/3,当X 变成一个列表时,它应用X 元素的替换。 select/4 可以这样实现
myselect(B, I, X, R) :-
    append(A, [B|C], I), append(A, [X|C], R).

这个表格很方便,因为我们有输入列表右侧的部分I ,我想你需要分配剩余的变量。然后在 X 上递归元素应该做:
distribute(I, [X|Xs], L) :-
    append(A, [_|C], I),
    distribute(C, Xs, R),
    append(A, [X|R], L).
distribute(I, [], I).

distribution/3 的行为方式如下:
?- distribute([a,b,c,d],[1,2],X).
X = [1, 2, c, d] ;
X = [1, b, 2, d] ;
X = [1, b, c, 2] ;
X = [a, 1, 2, d] ;
X = [a, 1, c, 2] ;
X = [a, b, 1, 2] ;
false.

因此
variablize_l(I, X, L) :-
    bagof(R, distribute(I, X, R), L).

给我们:
?- variablize_l([a,b,c],[X,Y],L).
L = [[X, Y, c], [X, b, Y], [a, X, Y]].

编辑

我最初是这样写的,这里是将分发阶段与列表构建分开的证据:
replace_v([_|T], X, [X|T]).
replace_v([L|T], X, [L|R]) :-
    replace_v(T, X, R).
variablize(I, X, L) :-
    bagof(E, replace_v(I, X, E), L).

关于prolog - 替换 Prolog 中列表的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10161916/

相关文章:

prolog - DCG 加倍计数

list - 删除列表中指定索引处的元素

reflection - 如何列出具有特定原子的所有谓词?

odbc - 插入 postgresql 时 swi-prolog odbc 错误

Prolog 和 Magic Squares 与 CLPFD

prolog - 否定中的削减行为

prolog - Prolog 中的 DNA 匹配

Prolog基本问题

string - Prolog-如何将表达式分配给变量

list - Prolog:计算列表中的正元素