Пролог Предикат для выравнивания - PullRequest
1 голос
/ 31 октября 2009

Под выравниванием я подразумеваю, что предикат занимает два списка, а три - со списком выравнивания. И затем проверьте, что каждый элемент в списке выравнивания действительно является элементом в обоих остальных списках. И есть требование к порядку, так что исключается просто проверка того, что каждый элемент в списке выравнивания является членом обоих других входных списков. Если я просто проверю член, действительное выравнивание также будет действительным при обратном. Что, конечно, не так.

Example:
?- mxAli([4,2,9,8],[1,9,5,2,3,8],A).
A=[2,8] or A=[9,8]

8,2 и 8,9 не действительны здесь.

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

Моя идея в том, что мне или прологу необходимо продолжить поиск по индексу его текущего элемента. Что сделало бы обратное выравнивание недействительным?

Редактировать: поиск продолжится после индекса текущего элемента в обоих списках. Как и в примере выше, когда он находит 2, он начинает поиск следующего элемента по индексу 2 и индексу 5. (Первый элемент равен 1)

Ответы [ 2 ]

2 голосов
/ 31 октября 2009

Наивным способом проверки выравнивания будет использование append/3, то есть что-то вроде:

append(_, [El | T1], L1),
append(_, [El | T2], L2),
...

, где L1 и L2 - данные списки, а El - элемент, которым они должны делиться. Позже вы можете проверить, совпадают ли T1 и T2.

Ниже приводится полное решение:

align(L1, L2, [El | T]) :-
    append(_, [El | T1], L1),
    append(_, [El | T2], L2),
    align(T1, T2, T).

align(_L1, _L2, []).

% Test, executed at consult time
:- align([4,2,9,8], [1,9,5,2,3,8], Alignment), writeln(Alignment), fail; true.

Тест распечатывает:

[2, 8]
[2]
[9, 8]
[9]
[8]
[]
1 голос
/ 01 ноября 2009

Ключ не слишком много мыслит алгоритмически, но проходит через случаи, когда предикат должен быть истинным.

Здесь я бы рассмотрел случаи, когда список выравнивания (3-й аргумент) пуст и что он не пуст. Для непустого случая опишите, что должно храниться для первого элемента списка вывода, и используйте рекурсию для остальной части списка.

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