Фильтрация списка с несколькими элементами в Прологе - PullRequest
0 голосов
/ 17 октября 2018

Я пытаюсь написать фильтр предикатов / 3

пример filter([a,a,b,c,d,d],[a,d],L) и L объединить с [b, c]

я уже пишу предикат delete / 3, и я использую этодля моего фильтра

delete([],_,[]).
delete([A|X],E,Z) :- A==E, delete(X,E,Z).
delete([A|X],E,[A|Z]) :- A \== E, delete(X,E,Z).

filter(M,[],M).                                                                                                                                                                                             
filter([K|M],[E|N],Z) :- delete([K|M],E,Z), filter(Z,N,B).

Удаление работает хорошо, но фильтра нет, пример с трассировкой

filtre([1,1,3,7,7],[1,7],Z).

В последней строке трассы дерева есть:

N-3 Call: (10) filtre([3], [], _18304470) ? creep N-2 Exit: (10) filtre([3], [], [3]) ? creep N-1 Exit: (9) filtre([3, 7, 7], [7], [3]) ? creep N Exit: (8) filtre([1, 1, 3, 7, 7], [1, 7], [3, 7, 7]) ? creep

Строки N-3 и N-2, я вижу, пролог нашел правильный результат, но он возвращает [3,7,7] вместо [3], и я не понимаю, почему он не останавливаетсяна линии N-2.

1 Ответ

0 голосов
/ 17 октября 2018

Запустив свой код, первое, что вы получите - Singleton variables: [B].Обычно одноэлементные переменные указывают на ошибку в логике, потому что эти переменные никогда не используются.В этом случае программа не возвращает правильный результат, потому что сначала вы должны вызвать delete([K|M],E,Z1) в списке Z1, а затем снова вызвать фильтр таким образом filter(Z1,N,Z).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...