Пролог - удалить участника из списка - PullRequest
1 голос
/ 12 июня 2019

Я новичок в прологе, и я написал этот код, который предполагает возвращать все подсписки списка без какого-либо из них.

contained(X, Y) :-
member(M, Y).
select(M, Y, X).

Я ввожу запрос:

contained(X, [1,2]) .

Ожидаемый результат:

[1],
[2]

Результат, который я получаю:

true,
true

Чего мне не хватает?

1 Ответ

1 голос
/ 12 июня 2019

Вы допустили ошибку, указав точку (.) в конце 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).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...