0

作为我最后一个问题的后续问题(感谢帕特里克),

我有一个像这样的变量列表,它是谓词的输出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丢失了。我需要建立一个约束模型,以便稍后我可以处理列表中的每个变量(比如设置每个变量的范围),最后能够给出 list 的修复结果X

有没有办法在拆分时避免将枢轴绑定到变量?

4

1 回答 1

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]
    ).

我只用你的测试输入测试了这个;由于没有统一的相等检查是超逻辑的,因此在一般情况下它可能会或可能不会正确运行。

于 2014-10-01T10:31:42.013 回答