2009-10-31 3 views
1

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

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

Наивным способом проверки выравнивания было бы использовать 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] 
[] 
+0

[E1 | T1], разве вы не удаляете голову здесь? Так что T1 и T2 будут пустыми в конце? – Algific

+0

Удаление? [E1 | T1] соответствует списку с хотя бы одним элементом. В результате переменные E1 и T1 получают привязки. Это все. Обратите внимание, что это не полное решение, поскольку вам нужен намек. Вам нужно написать «удаление» или «добавление» частей самостоятельно. – Kaarel

+0

Я схожу с ума, дай мне что-то еще. Более того, я попросил! – Algific

1

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

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