为什么回溯/不发生(以false或否结束搜索)?



这是一个问题,问为什么回溯发生在一个简单的程序中,而不是另一个。

示例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),
!.

相关内容

最新更新