处理未绑定的变量和列表

时间:2019-03-21 20:03:08

标签: prolog

比方说,我有以下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).

2 个答案:

答案 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