我做的序言中一个非常简单的练习,有件事情我不跟踪了解。 该程序是一个“大于”( >
)上表示为接班人整数:
greater_than(succ(_), 0).
greater_than(succ(A), succ(B)) :-
greater_than(A, B).
我的问题:我不明白为什么请求greater_than(succ(succ(succ(0))),succ(0))
生成redo
下面的跟踪:
[trace] ?- greater_than(succ(succ(succ(0))),succ(0)).
Call: (6) greater_than(succ(succ(succ(0))), succ(0)) ? creep
Call: (7) greater_than(succ(succ(0)), 0) ? creep
Exit: (7) greater_than(succ(succ(0)), 0) ? creep
Exit: (6) greater_than(succ(succ(succ(0))), succ(0)) ? creep
true ;
Redo: (7) greater_than(succ(succ(0)), 0) ? creep
Fail: (7) greater_than(succ(succ(0)), 0) ? creep
Fail: (6) greater_than(succ(succ(succ(0))), succ(0)) ? creep
false.
为什么会出现redo
吗? 我怎样才能避免它(无切口,当然)?
顺便说一句,我可以告诉大家:不,这不是什么功课?