这是一个问题,问为什么回溯发生在一个简单的程序中,而不是另一个。
示例1。
% water/2 relates temperature to state
water(Temp, solid) :- Temp =< 0.
water(Temp, liquid) :- Temp > 0, Temp < 100.
water(Temp, gas) :- Temp >= 100.
?- water(50,X).
X = liquid
false
2例子。
% parent facts
parent(john, jane).
parent(john, james).
parent(sally, jane).
parent(martha, sally).
?- parent(X, jane).
X = john
X = sally
在示例1中,prolog发现X=liquid
为一个解,然后提示搜索更多解。如果没有找到,则返回false.
在示例2中,prolog正确地找到X=john
,提示继续搜索,然后找到X=sally
,但随后不提示继续搜索。它不会以false结束表示它尝试了剩余的规则(例如parent(martha,sally)
是最后一个规则)并且失败了。
问题:为什么第一个例子以假结束,而第二个却没有?
简单地写一条规则,禁止水处于多个状态。有几种方法(主要使用例如cut),这里有一个:
water_temp_state(Temp, State) :-
( Temp =< 0 -> State = solid
; Temp < 100 -> State = liquid
; State = gas
).
结果:
?- water_temp_state(-5, S).
S = solid.
?- water_temp_state(5, S).
S = liquid.
?- water_temp_state(500, S).
S = gas.
在实际可能多个状态时使用多个谓词。
这里是另一个方法,只是为了好玩:
water_state_comparison(solid, =<, 0).
water_state_comparison(liquid, <, 100).
water_state_comparison(gas, >=, 100).
water_temp_state_compare(Temp, State) :-
water_state_comparison(State, Comp, Num),
Pred =.. [Comp, Temp, Num],
call(Pred),
!.
…