Prolog - 拆分变量列表时如何保留信息?

时间:2014-10-01 10:16:01

标签: prolog unification

作为我last question的后续问题(感谢Patrick),

我有一个像这样的变量列表,它是谓词to_var_list(InputList, X)的输出:

X = [_G1426, _G1429, _G1432, 9, _G1438, _G1441].

现在我希望将列表拆分为" 9",结果应该是:

 Result = [[_G1426, _G1429, _G1432],[_G1438, _G1441]].

我正在使用这样的谓词:

split(List, Pivot, Result) :-
    (append(Left, [Pivot|Rest], List)
    -> Result = [Left|Right],
    split(Rest,Pivot,Right);
    Result = [List]).

但这仅适用于非变量列表的列表,例如:

Y = [1,2,6,9,6,5,9,7,1]

如果设置枢轴为" 9"然后列表将分成

Result = [[1,2,6],[6,5],[7,1]]

但是对于上面的变量列表,应用此谓词会自动将每个无界变量绑定到数据透视表,输出列表是这样的:

X = [9,9,9,9,9,9]
Result = [[],[],[],[],[],[],[]]

我知道我可以首先拆分它们然后应用to_var_list,但是原始列表X中保留的关系将丢失。我需要构建一个约束模型,以便稍后我可以处理列表中的每个变量(比如设置每个变量的范围),最后能够给出列表X的修复结果。

在进行拆分时,有没有办法避免将数据绑定到变量?

1 个答案:

答案 0 :(得分:0)

==将进行无约束的等式检查:

?- X == 9.
false.

?- X == Y.
false.

?- X == X.
true.

?- X = Y, X == Y.
X = Y.

所以你可以分成如下:

split([First|Rest], Pivot, Result) :-
    (First == Pivot ->
        Result = [[], Rest]
    ;
        split(Rest, Pivot, [Left, Right]),
        Result = [[First|Left], Right]
    ).

我只测试了你的测试输入;因为没有统一的等式检查是非逻辑性的,所以在一般情况下它可能或者可能不正确。