Соответствие нескольким спискам - PullRequest
0 голосов
/ 23 октября 2010

Я могу написать предикат, который удовлетворяется, когда два списка равны, например, равны ([2,3], [2,3]), будут истинными и равными ([2,3], [4,5]).будет ложным.

Однако, что если я захочу получить список и попытаться сопоставить его с любым списком в списке списков, например, match ([2,3], [[5,6], [4,6,2], [2,3]]).будет истиной из-за последнего списка в списке списков, но совпадения ([2,3], [[3,4], [4,2,1]]).будет ложным, потому что [2,3] ничего не соответствует в списке списков.

Я думаю, может быть, нам здесь может понадобиться вложенная рекурсия?Есть идеи, как ты это делаешь?Проблема, которую я пытаюсь решить, гораздо сложнее, но если я смогу это сделать, я смогу решить всю проблему.

Ответы [ 2 ]

0 голосов
/ 23 октября 2010

ОБНОВЛЕНИЕ: я думал, что все было сложнее из-за вложенного списка, но что-то настолько простое, насколько это действительно работает:

 match( Search, [H|_] ) :-
    Search = H, !.
match( Search, [H|T] ) :-
    Search \= H,
    match( Search, T ).

Джулио, ваш ответ был очень полезным, так что спасибо:).

0 голосов
/ 23 октября 2010

Рекурсивная навигация по списку Пролога обычно достигается с помощью пары предложений: первое - это условие, при котором рекурсия останавливается и возвращается результат; второй содержит рекурсивный вызов. С этой целью в заголовке каждого предложения список, для которого должна быть выполнена рекурсия, обычно разбивается на две части, изолируя первый элемент (известный как заголовок) от остальной части списка (известный как хвост), такой как в следующее:

p(Element, [Head | Tail]) :- % ...

В этом рекурсивном предложении вы обрабатываете Head и, в зависимости от результата, продолжаете вызывать свой предикат, передавая Tail в качестве второго аргумента, таким образом фактически перемещаясь по всему списку по одному элементу за раз.

При написании такого предиката вы можете сократить (используя !) альтернативные решения (которые иногда приводят только к сбоям), когда вы найдете искомый результат, например. в вашем случае, когда вы найдете совпадение между первым списком и элементом во втором списке, вам не нужно идти дальше, поэтому любая открытая ветвь в демонстрационном дереве должна быть удалена.

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