Debugging 跟踪时,Prolog中的重做是什么?

Debugging 跟踪时,Prolog中的重做是什么?,debugging,prolog,trace,shortest-path,Debugging,Prolog,Trace,Shortest Path,我有以下代码(迭代深化以找到最短路径): 当我追踪它时,在它给我的一个轨迹中: 2 2 Redo: length([],0) ? 这里发生了什么事? 还有,这条线左边的2是什么 跟踪的其余部分: 1 1 Call: path(a,g,_23) ? 2 2 Call: length(_23,_55) ? 2 2 Exit: length([],0) ? 3 2 Call: path_r(a,g,[]) ? 3 2

我有以下代码(迭代深化以找到最短路径):

当我追踪它时,在它给我的一个轨迹中:

    2    2  Redo: length([],0) ? 
这里发生了什么事? 还有,这条线左边的2是什么

跟踪的其余部分:

  1    1  Call: path(a,g,_23) ? 
  2    2  Call: length(_23,_55) ? 
  2    2  Exit: length([],0) ? 
  3    2  Call: path_r(a,g,[]) ? 
  3    2  Fail: path_r(a,g,[]) ? 
  2    2  Redo: length([],0) ? 
  2    2  Exit: length([_80],1) ? 
  3    2  Call: path_r(a,g,[_80]) ? 
  4    3  Call: arc(a,_146) ? 
  4    3  Exit: arc(a,g) ? 
  5    3  Call: path(g,g,[]) ? 
  6    4  Call: length([],_158) ? 
  6    4  Exit: length([],0) ? 
  7    4  Call: path_r(g,g,[]) ? 
  7    4  Exit: path_r(g,g,[]) ? 
  5    3  Exit: path(g,g,[]) ? 
  3    2  Exit: path_r(a,g,[a]) ? 
  1    1  Exit: path(a,g,[a]) ? 

这是答案中的注释,因为它不适合注释

在本程序中使用
length(Path,41;
用于生成不同长度的列表

如果在SWI Prolog中运行查询
length(X,N)
,则会得到以下结果

?- length(List,N).
List = [],
N = 0 ;
List = [_774],
N = 1 ;
List = [_774, _780],
N = 2 ;
List = [_774, _780, _786],
N = 3 ;
List = [_774, _780, _786, _792],
N = 4 ;
List = [_774, _780, _786, _792, _798],
N = 5 
请注意如何返回长度不断增加的列表。当您想要生成列表中的结果,但您不知道列表的长度,或者想要返回不同长度的列表时,这个常用的技巧就可以做到这一点


花几个小时,在Prolog示例中或其他地方查看其他代码,您会注意到的用法,现在您已经知道了。

这不是注释,而是答案

Redo: length([],0) ? 
这里发生了什么事

这是您的跟踪输出;我添加了一个标识符和行号,以准确识别
跟踪

Trace  1   1    1  Call: path(a,g,_23) ? 
Trace  2   2    2  Call: length(_23,_55) ? 
Trace  3   2    2  Exit: length([],0) ? 
Trace  4   3    2  Call: path_r(a,g,[]) ? 
Trace  5   3    2  Fail: path_r(a,g,[]) ? 
Trace  6   2    2  Redo: length([],0) ? 
Trace  7   2    2  Exit: length([_80],1) ? 
Trace  8   3    2  Call: path_r(a,g,[_80]) ? 
Trace  9   4    3  Call: arc(a,_146) ? 
Trace 10   4    3  Exit: arc(a,g) ? 
Trace 11   5    3  Call: path(g,g,[]) ? 
Trace 12   6    4  Call: length([],_158) ? 
Trace 13   6    4  Exit: length([],0) ? 
Trace 14   7    4  Call: path_r(g,g,[]) ? 
Trace 15   7    4  Exit: path_r(g,g,[]) ? 
Trace 16   5    3  Exit: path(g,g,[]) ? 
Trace 17   3    2  Exit: path_r(a,g,[a]) ? 
Trace 18   1    1  Exit: path(a,g,[a]) ?  
Fact 1          arc(a, g).
Fact 2          arc(a, b).
Fact 3          arc(b, g).

Predicate 1,1   path(X, Z, Path) :-
Predicate 1,2      length(Path, _),
Predicate 1,3      path_r(X, Z, Path).

Predicate 2,1   path_r(Z, Z, []).

Predicate 3,1   path_r(X, Z, [X|Path]) :-
Predicate 3,2       arc(X, Y),
Predicate 3,3       path(Y, Z, Path).
这是你的源代码;我添加了一个标识符和行号,以准确识别
事实
谓词

Trace  1   1    1  Call: path(a,g,_23) ? 
Trace  2   2    2  Call: length(_23,_55) ? 
Trace  3   2    2  Exit: length([],0) ? 
Trace  4   3    2  Call: path_r(a,g,[]) ? 
Trace  5   3    2  Fail: path_r(a,g,[]) ? 
Trace  6   2    2  Redo: length([],0) ? 
Trace  7   2    2  Exit: length([_80],1) ? 
Trace  8   3    2  Call: path_r(a,g,[_80]) ? 
Trace  9   4    3  Call: arc(a,_146) ? 
Trace 10   4    3  Exit: arc(a,g) ? 
Trace 11   5    3  Call: path(g,g,[]) ? 
Trace 12   6    4  Call: length([],_158) ? 
Trace 13   6    4  Exit: length([],0) ? 
Trace 14   7    4  Call: path_r(g,g,[]) ? 
Trace 15   7    4  Exit: path_r(g,g,[]) ? 
Trace 16   5    3  Exit: path(g,g,[]) ? 
Trace 17   3    2  Exit: path_r(a,g,[a]) ? 
Trace 18   1    1  Exit: path(a,g,[a]) ?  
Fact 1          arc(a, g).
Fact 2          arc(a, b).
Fact 3          arc(b, g).

Predicate 1,1   path(X, Z, Path) :-
Predicate 1,2      length(Path, _),
Predicate 1,3      path_r(X, Z, Path).

Predicate 2,1   path_r(Z, Z, []).

Predicate 3,1   path_r(X, Z, [X|Path]) :-
Predicate 3,2       arc(X, Y),
Predicate 3,3       path(Y, Z, Path).
解释 要了解下面对
length/2
的调用,请参见long comment as other

除了重做之外,我还介绍了一些步骤,这样您就可以编写更多的示例行,这样您可以根据自己的选择完成这项工作


虽然这个例子是一个非常简单的例子,但对于初学者来说,
length/2
的使用确实让人难以理解。

“Redo”意味着Prolog是一个更好的关键词,而不是
Redo
,你给了我们谓词,但您启动的查询是什么?如果您可以读取OCaml,那么将显示它在OCaml中的工作方式。@GuyCoder查询是:path(a,g,P)。