我有以下序言谓词,用于检查两个列表是否没有共同的成员。
我打算将列表用作变量集,并希望能够通过在需要与另一个列表不相交的列表中填充空位来按需创建新变量。
这是定义
% check if two sets
% are disjoint
set_disjoint(SELF, OTHER) :- intersection(SELF, OTHER, []).
该谓词正确识别两个地面列表是否不相交
?- set_disjoint([4], [5]).
true.
?- set_disjoint([4], [4]).
false.
但是,当列表中包含变量并且仅返回false时,它无法创建新内容。
?- set_disjoint([4], [A]).
false.
?- set_disjoint([4], B).
false.
?- set_disjoint([4], [5, A]).
false.
我认为这是Prolog的固有属性,因为\=
的工作方式相同。有很多东西不是7
,但是X
与其中的任何一个都不统一。
?- X \= 7.
false.
我正在使用的方言SWI Prolog确实有gensym
。 gensym
产生的值不能保证在系统中是唯一的,但是如果用户遵守记录的命名约定,则可以很好地工作。
是否有一种方法可以创建不相交的定义,该定义调用gensym
来填充两个参数中的空缺……或使用其他策略来完成不完整的参数?
如果这不可能或不方便,是否可以通过这样一种方式定义disjoint
:如果任何一个参数都不完全正确,它会导致程序异常崩溃?