所以在这里,对于我的数独项目,我有一个列表,例如:
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的错误?
感谢任何启蒙!
答案 0 :(得分:4)
如果您的术语_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
谓词就可以使用。