Пролог Рекурсия по списку - PullRequest
0 голосов
/ 27 апреля 2020

Мне нужен предикат, который просматривает список списков и проверяет, проверяет ли каждый из этих списков определенные условия; в случае, если список проверяет условия, он добавляется в ResultList (другой список списков). Я написал это:

mypredicate(ListOfLists, ReferenceList, ResultList) :-
    mypredicate(ListOfLists, ReferenceList, ResultList, []),

mypredicate([H|T], ReferenceList, ResultList, Acc) :-
    elementos_comuns(ReferenceList, H),
    H \== ReferenceList,
    append(Acc, H, ResultList),
    T \== [],
    mypredicate(T, ReferenceList, ResultList, ResultList).

Я только хочу добавить, если обе строки выше "append" возвращают true, и независимо от того, что происходит в первых 3 строках, я хочу, чтобы он запускал последнюю строку, если T \ == [].

Проблема в том, что когда он достигает элемента ListOfLists, который не проверяет один из этих двух:

elementos_comuns(ReferenceList, H),
H \== ReferenceList,

, все возвращается false.

Мне нужно, чтобы ResultList был списком списков, который содержит списки из "ListOfList", которые проверяют

elementos_comuns(ReferenceList, H),
H \== ReferenceList,

Я понятия не имею, как это сделать, любая помощь приветствуется.

1 Ответ

0 голосов
/ 28 апреля 2020

Представьте, что вы звоните mypredicate с некоторым списком [A, B, C]. Он проверит некоторые условия на A, а затем выполнит повторение с [B, C]. Он проверит некоторые условия на B, а затем вернется к [C]. Он проверит некоторые условия на C, но затем, поскольку T теперь [], произойдет сбой на T \== []. Ваш предикат не имеет шансов на успех, пока у вас есть это условие. Вам, вероятно, следует удалить его и добавить еще одно предложение в форме mypredicate([], ..., ..., ...).

Даже тогда ваш предикат сможет обрабатывать только те случаи, когда все условия выполняются. Он потерпит неудачу, как только вы запустите его в списке, где elementos_comuns/2 не удастся.

Есть три различные ситуации, которые вы хотите обработать:

  • пустой список
  • список [H | T], где H удовлетворяет elementos_comuns/2 проверке
  • список [H | T], где H не удовлетворяет elementos_comuns/2 проверке

Предикат, который хочет для обработки трех отдельных случаев обычно должны состоять из трех пунктов.

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