我曾在这里提问关于Prolog中何时使用新变量调用Redo
,或者何时尝试使用相同变量。我认为我已经找到了答案。但是,在下面的代码片段中,我认为应该会调用另一个Redo
,但事实并非如此。
我的知识库如下:
location(desk,office).
location(apple,kitchen).
location(flashlight,desk).
location('washing machine',cellar).
location(nani,'washing machine').
location(broccoli,kitchen).
location(crackers,kitchen).
location(computer,office).
edible(apple).
edible(crackers).
我的查询是
?-location(X,kitchen),edible(X).
具有以下跟踪:
Call: (9) location(_5612, kitchen) ? creep
Exit: (9) location(apple, kitchen) ? creep
Call: (9) edible(apple) ? creep
Exit: (9) edible(apple) ? creep
X = apple ;
Redo: (9) location(_5612, kitchen) ? creep <====
Exit: (9) location(broccoli, kitchen) ? creep
Call: (9) edible(broccoli) ? creep
Fail: (9) edible(broccoli) ? creep
Redo: (9) location(_5612, kitchen) ? creep
Exit: (9) location(crackers, kitchen) ? creep
Call: (9) edible(crackers) ? creep
Exit: (9) edible(crackers) ? creep
X = crackers.
为什么第一个解决方案之后没有额外的Redo
,类似于Redo: (9) edible(apple)
(然后会失败,再继续下一个Redo
),因为代码中还有另一个函数符号为edible
的事实,这意味着会创建一个选择点?我在这里找到了相同查询的注释跟踪。我将发布其中的一个短片段,因为它具有我感觉在此处缺失的额外的Redo
:
有人能指导我在这种情况下应该期望什么吗?
谢谢。