统一模式匹配的奇怪行为

时间:2011-11-23 11:11:10

标签: prolog pattern-matching unification

所以在这里,对于我的数独项目,我有一个列表,例如:

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 个答案:

答案 0 :(得分:4)

如果您的术语_G1-2:3:4没有任何括号,则必须考虑运算符的关联性和优先级,以便了解该术语的解析方式。

术语_G1-2:3:4(_G1-2):(3:4)相同,而非_G1-(2:3:4),因此_G1-2:3:4X-_的统一失败。

如果您在条款中添加括号,例如_G1-(2:3:4),则原始的remove_position/2谓词就可以使用。