作为我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
的修复结果。
在进行拆分时,有没有办法避免将数据绑定到变量?
答案 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]
).
我只测试了你的测试输入;因为没有统一的等式检查是非逻辑性的,所以在一般情况下它可能或者可能不正确。