Странное поведение сопоставления шаблонов унификации - PullRequest
1 голос
/ 23 ноября 2011

Итак, для моего проекта судоку у меня есть список, например:

L = [_G1-0:0:0,_G19-0:6:2,_G22-0:7:2,_G25-0:8:2].

, и я хочу отфильтровать это, чтобы получить только свободные переменные:

[_G1, _G19, _G22 and _G25].

Итак, желая этого, я написал этот предикат:

remove_position([], []) :- !.
remove_position([X-_|Xs], [X|Rs]) :- remove_position(Xs, Rs).

При вызове

?- remove_position(L, Result).

SWI-Prolog отвечает

false.

Поэтому я немного отредактировал предикат:

remove_position([], []) :- !.
remove_position([X-_:_:_|Xs], [X|Rs]) :- remove_position(Xs, Rs).

и теперь все работает как положено:

?- remove_position(L, Result).
Result = [_G1, _G19, _G22, _G25].

Тем не менее, я не вижу, что не так с первым, для меня SWI-Prolog должен соответствовать 0:0: 0 с _ так же, как с _: _: _.Есть что-то, чего я не получаю?Или это ошибка SWI-Prolog?

Спасибо за просвещение!

1 Ответ

4 голосов
/ 23 ноября 2011

Если у вас есть термин _G1-2:3:4 без скобок, вы должны учитывать ассоциативность и приоритет операторов, чтобы выяснить, как анализируется термин.

Термин _G1-2:3:4 совпадает с (_G1-2):(3:4), а не _G1-(2:3:4), поэтому объединение _G1-2:3:4 и X-_ завершается неудачей.

Если вы добавите скобки к своим терминам, например _G1-(2:3:4), то ваш исходный предикат remove_position/2 будет работать.

...