У меня есть следующий предикат пролога, предназначенный для проверки того, нет ли в двух списках общих членов.
Я намерен использовать списки в качестве наборов переменных и хотел бы иметь возможность создаватьновые переменные по требованию, заполняя дыры в списке, который, как предполагается, не пересекается с другим списком.
Вот определение
% 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 Пролог, диалект, который я использую, имеет gensym
.Значение, создаваемое gensym
, не обязательно будет уникальным в системе, но будет работать приемлемо хорошо, если пользователь придерживается документированного соглашения об именах.
Есть ли способ создать определение дизъюнкта, котороевызывает gensym
для заполнения пробелов в любом из аргументов ... или использует какую-то другую стратегию для завершения неполных аргументов?
Если это невозможно или неудобно сделать, можно ли определить disjoint
втаким образом, что он аварийно завершает работу программы, если один из аргументов не полностью заземлен?