Я не совсем понял ваш вопрос, но я бы написал предикат contains/2
так:
% An empty list is contained by any list
contains(_, []).
% If a list is not empty, then its
% first element must be an element of L1,
% and its tail must be contained by L1.
contains(L1, [X | L2]) :-
member(X, L1),
contains(L1, L2).
Кстати, обратите внимание, что ваше первое правило (факт)
contains (L1, L1).
- синтаксическая ошибка (после имени предиката не должно быть пробела).
Также, если исправить, это создаст нежелательную точку выбора. Итак, скорее удалите его.
Если вы хотите использовать assert/1
в приглашении Prolog, тогда выполните
?- assert(contains(_, [])).
Yes
?- assert(contains(L1, [X | L2]) :- (member(X, L1), contains(L1, L2))).
Yes
Чтобы увидеть, что попало в базу знаний, используйте listing/0
.
?- listing.
:- dynamic contains/2.
contains(_, []).
contains(B, [A|C]) :-
member(A, B),
contains(B, C).
Yes
Я не думаю, что проблема в «утверждении свободных переменных», как вы указали в своем собственном ответе. Скорее проверьте ваш брекетинг.