Преступник:
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).