Prolog实现列表首元素匹配规则 支持未知参数查询的解决方法
Prolog testpos规则变量推导问题修复
定义的testpos规则预期逻辑为:当Var1和Var2分别是两个给定列表的首元素时返回true。
当前规则在给定明确参数查询时运行正常:
?- testpos([test1, test2, test3], [testA, testB, testC], test1, testA). true. ?- testpos([test1, test2, test3], [testA, testB, testC], test1, testB). false.
但该规则无法支持未知输入参数的推导,预期推导效果如下:
?- testpos([test1, test2, test3], [testA, testB, testC], Z, X). Z = test1 X = testA false.
原错误实现代码:
testpos([X| _], [Y| _], Var1, Var2) :- X == Var1, Y == Var2.
问题原因
Prolog中==为全等判断操作符,仅校验两边项是否完全一致,不会执行变量合一操作,当传入未绑定的变量时,全等判断会直接返回false,无法完成预期的变量赋值。
修复方案
将全等操作符==替换为合一操作符=即可,修复后代码如下:
testpos([X| _], [Y| _], Var1, Var2) :- X = Var1, Y = Var2.
也可以直接在参数位完成合一,写法更简洁:
testpos([Var1| _], [Var2| _], Var1, Var2).
修复后即可同时支持固定参数校验和未知参数推导的需求。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

