PROLOG如何实现已绑定变量用==匹配、未绑定变量用=匹配的需求
Prolog规则匹配区分绑定/未绑定变量实现方案
问题根因
你遇到的非预期返回是因为Prolog默认合一操作=会自动将两个不同的未绑定变量绑定来满足匹配规则,第二个查询中Thing和Location都是未绑定变量,合一时会被自动赋值为同一个值,才会返回不符合预期的成功结果。
实现方案
你可以用Prolog内置的var/1(判断变量是否未绑定)、nonvar/1(判断变量是否已绑定)谓词实现你需要的匹配逻辑:已绑定项用严格相等==校验、未绑定变量仅允许同一个变量匹配、单端绑定的情况走常规合一。
修改后的完整代码如下:
% 原有矛盾规则不变 contradicts(at(X,_), location(X)). % 自定义匹配规则:区分绑定/未绑定变量 custom_match(Term1, Term2) :- ( % 两个项都已绑定:用严格相等校验,不做任何变量绑定 nonvar(Term1), nonvar(Term2) -> Term1 == Term2 ; % 两个都是未绑定变量:必须是同一个变量才匹配,不做跨变量绑定 var(Term1), var(Term2) -> Term1 == Term2 ; % 一端绑定一端未绑定:走常规合一逻辑 Term1 = Term2 ). % 修改后的矛盾校验规则 mustContradict(A, B) :- contradicts(A, ContradictTerm), custom_match(ContradictTerm, B).
测试验证
- 原正常查询
mustContradict(at(Thing,Location),location(Thing)).:
匹配时ContradictTerm为location(Thing),和查询参数的location(Thing)参数是同一个变量,返回成功,符合预期。 - 原异常查询
mustContradict(at(Thing,Location),location(Location)).:
匹配时ContradictTerm的参数Thing和查询参数的Location是两个不同的未绑定变量,匹配失败,不会返回Thing=Location的非预期结果,符合需求。
内容的提问来源于stack exchange,提问作者Topological Sort
相关产品推荐
相关产品推荐

