比方说,我有以下3x3的未绑定变量网格和另一个绑定变量列表L。我想两者都链接。例如。
网格A:
[[_6308, _6314, _6308], [_6308, _6308, _6314], [_6314, _6308, _6308]]
列表B:
[1 , 2 , 3]
我想按从左到右的顺序选择变量,并将其绑定到未绑定的变量。在这种情况下,这3个将被忽略,因为我只有2个未绑定变量。
结果列表应为:
[[1,2,1],[1,1,2],[2,1,1]]
?- fill([1,2,3],[[_6308, _6314, _6308], [_6308, _6308, _6314], [_6314, _6308, _6308]]).
[[2, 1, 2], [2, 2, 1], [1, 2, 2]]
有什么想法可以实现吗?我尝试过这个想法,但它是完整的,因为它对所有元素只返回1。
fill(_,[]) .
fill(L,[H|T]):-
helper(L,H),
fill(L,T).
helper(_,[]).
helper(L,[H|T]) :-
member(H,L),
helper(L,T).
答案 0 :(得分:3)
您可以使用term_variables/2
查找术语中的变量列表,并声称它是术语列表的前缀:
prefix_of([],_).
prefix_of([X|Xs],[X|Ys]) :-
prefix_of(Xs,Ys).
grid_pool(Grid,Pool) :-
term_variables(Grid,Vs),
prefix_of(Vs,Pool).
以您的示例为例:
?- G = [[A, B, A], [A, A, B], [B, A, A]], grid_pool(G, [1,2,3,4]).
G = [[1, 2, 1], [1, 1, 2], [2, 1, 1]],
A = 1,
B = 2.
Vs
中变量的顺序是术语遍历的顺序:深度优先和从左至右。
答案 1 :(得分:1)
您如何精确地将变量与值绑定?例如,通过下面的代码重写,我将选择的值也从左到右统一为变量:
fill(Values, Variables) :-
% invert argument order to take advantage
% of first-argument indexing
fill_variables(Variables, Values).
fill_variables([], _).
fill_variables([List| Lists], Values) :-
helper(List, Values),
fill_variables(Lists, Values).
helper([], _).
helper([Variable| Variables], [Value| Values]) :-
( var(Variable) ->
% unbound variable; unify with the next value
Variable = Value,
helper(Variables, Values)
; % already bound variable
helper(Variables, [Value| Values])
).
我们得到:
| ?- L = [[A, B, A], [A, A, B], [B, A, A]], fill([1,2,3], L).
A = 1
B = 2
L = [[1,2,1],[1,1,2],[2,1,1]]
yes