Вы допустили ошибку, указав точку (.
) в конце member(M, Y)
.это означает, что Пролог думает, что вы написали:
contained(X, Y) :-
member(M, Y)<b>.</b> %% notice the dot (.) here
select(M, Y, X).
Итак, вы определили contained(X, Y)
как member(M, Y)
, и, кроме того, вы реализовали предикат с именем select(M, Y, X)
, который всегда верен для всех значений для M
, Y
и X
.
Вы можете заменить .
запятой (,
) здесь:
contained(X, Y) :-
member(M, Y)<b>,</b>
select(M, Y, X).
Как говорится, вы делаете не нужно member/2
здесь.Фактически, используя member, если список содержит повторяющиеся значения, это приведет к получению одного и того же списка несколько раз.
Вы можете просто использовать select/3
[swi-doc] здесь с подстановочным знаком (_
) на элементе для удаления:
contained(X, Y) :-
select(<b>_</b>, Y, X).
или мы можем использовать явную рекурсию:
contained(T, [_|T]).
contained([H|T1], [H|T2]) :-
contained(T1, T2).