SWI-Пролог проверяет, находятся ли два элемента в разных списках в одной позиции - PullRequest
0 голосов
/ 10 октября 2018

Я получил задание, в котором мне нужно написать предикат "same_position (L1, L2, E1, E2)", где L1 и L2 - списки, E1 - элемент из L1, а E2 - элемент из L2.предикат верен, когда E1 и E2 находятся в одинаковых позициях в своих списках.Мне нужно решить эту проблему с помощью рекурсии

, это мое решение проблемы:

same_position([L1|_],[L2|_],E1,E2) :- L1==E1,L2==E2.
same_position([_|L1],[_|L2],E1,E2) :- same_position(L1,L2,E1,E2).

это работает, но не полностью, как ожидалось, вместе с назначением пришел пример вывода, гдениже часть проблемы.Ожидаемый вывод дает значения для L перед печатью false, где мое решение просто печатает false.что я делаю не так?

Ожидаемый выход:

?- same_position(L, [a,a,c], 3, a).
L = [3|_G1667] ;
L = [_G1769, 3|_G1772] ;
false.

Мой вывод:

?- same_position(L,[a,a,c],3,a).
false.

1 Ответ

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

Преступник:

same_position([L1|_],[L2|_],E1,E2) :- <b>L1==E1</b>, L2==E2.
same_position([_|L1],[_|L2],E1,E2) :- same_position(L1,L2,E1,E2).

Предикат (==)/2 [swi-doc] определяется как:

@Term1 == @Term2

True, если Term1 эквивалентно Term2.Переменная идентична только переменной общего доступа .

Таким образом, это означает, что для переменной X сохраняется только X == X, а не X == Y (если только X = Y), и X == 3 всегда терпит неудачу (если X не было уже заземлено до 3).

На основании вашего примера вывода вы, однако, не хотите проверять равенство,Вы хотите унифицировать , что делает (=)/2:

same_position([L1|_],[L2|_],E1,E2) :- <b>L1 = E1, L2 = E2</b>.
same_position([_|L1],[_|L2],E1,E2) :- same_position(L1,L2,E1,E2).

В Прологе, однако, мы также можем inify в head , используя то же переменная дважды (или больше) в голове:

same_position([L1|_],[L2|_]<b>, L1, L2</b>).
same_position([_|L1],[_|L2],E1,E2) :- same_position(L1,L2,E1,E2).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...