受限域唯一性表示及Prolog中bar函数返回值修正方案问询
解决Bar函数始终返回False的问题
我完全理解你的困扰——当前bar/2的实现会出现返回true的情况,但实际上任何整数都不可能大于自身,这明显不符合预期。咱们可以通过两种思路来修正这个问题:
方案一:直接硬编码Bar的结果(最简单)
既然bar(X)的逻辑就是调用foo(X,X),而x > x永远为假,那我们可以跳过中间的foo/3调用,直接让bar/2返回false:
bar(_, false).
这样不管输入的X是什么类别,bar(X, Return)都会直接返回Return = false,完全符合需求。
方案二:修改GT谓词处理相同参数的情况
如果你希望保持bar/2通过foo/3调用gt/3的逻辑链,可以给gt/3添加一个优先匹配的规则,专门处理两个输入参数相同的情况:
% 新增规则:任何值都不大于自身,优先匹配 gt(Same, Same, false). % 保留原来的gt规则(放在新增规则之后) %% pos_int greater then ... gt(pos_int,zero_int,true). gt(pos_int,neg_int,true). gt(pos_int, pos_int, X) :- boolean(X). %% zero greater than ... gt(zero_int, pos_int, false). gt(zero_int,zero_int,false). gt(zero_int, neg_int, true). %% neg int greater than... gt(neg_int, pos_int, false). gt(neg_int, zero_int, false). gt(neg_int, neg_int, X) :- boolean(X). % 布尔值定义不变 boolean(true). boolean(false).
因为Prolog是按规则顺序匹配的,当调用gt(X,X,Return)时,会先匹配到新增的gt(Same, Same, false)规则,直接返回false,不会触发后面同类别变量的可选规则。
此时bar/2的定义不需要修改:
bar(X,Return) :- foo(X,X,Return).
测试结果会完全符合预期:
?- bar(X,Return). X = pos_int, Return = false ; X = zero_int, Return = false ; X = neg_int, Return = false.
这两种方案都能解决你的问题,方案一更简洁,方案二更贴合你原本的谓词逻辑链,可以根据需求选择。
内容的提问来源于stack exchange,提问作者beoliver
相关产品推荐
相关产品推荐

