Prolog 不清楚这个序言深度优先搜索(DFS)方法代码是如何工作的

Prolog 不清楚这个序言深度优先搜索(DFS)方法代码是如何工作的,prolog,depth-first-search,Prolog,Depth First Search,今天,一位老师在序言中给了我们以下代码: dfs\u路径(树(X,void,void),[X]):-!。 dfs_路径(树(X,L,u-R),[X|Xs]):-dfs_路径(L,Xs)。 dfs|u路径(树(X,L,R),[X|Xs]):-dfs_路径(R,Xs)。 树木(甲):- A=树(i, 树(A, 树(la,void,void), 树(sa,void,void) ), 树(b,, 树(磅,空,空), 树(某人,无效,无效) )). 他告诉我们,代码是在prolog上使用DFS方法的一种

今天,一位老师在序言中给了我们以下代码:

dfs\u路径(树(X,void,void),[X]):-!。
dfs_路径(树(X,L,u-R),[X|Xs]):-dfs_路径(L,Xs)。
dfs|u路径(树(X,L,R),[X|Xs]):-dfs_路径(R,Xs)。
树木(甲):-
A=树(i,
树(A,
树(la,void,void),
树(sa,void,void)
),
树(b,,
树(磅,空,空),
树(某人,无效,无效)
)).
他告诉我们,代码是在prolog上使用DFS方法的一种方式,但我们没有收到关于代码在每一行上如何工作的更多信息

我是一个使用prolog的新手,我正在努力理解这段代码

谢谢大家

更新:这是树


显然,我们希望通过回溯来确定从树根到其中一片叶子的所有路径

首先,必须更正树的声明:

树是一个术语,构建/编写如下(注意:每个文本元素都是小写的,否则我们将写下变量而不是常量):

树(i,
树(a,
树(la,void,void),
树(sa,void,void)),
树(b,,
树(磅,空,空),
树(某人,无效,无效))。
我们只需声明一个事实,将这棵树作为参数来存储

tree\u存储(
树(i,,
树(a,
树(la,void,void),
树(sa,void,void)),
树(b,,
树(磅,空,空),
树(sb,void,void)))
).
现在是“访问代码”

dfs\u路径(+树、?路径)
它通过
tree
给定的树构建(或验证)路径
path

如果第一个参数看起来像叶节点(即使用带有3个参数的函子
tree
构建,并且参数位置2和3上的常量
void
),则路径就是节点的名称:

dfs\u路径(树(X,void,void),[X])。
根本不需要
剪切

否则,如果树的左分支为non-
void
,则可以通过沿着左分支递归生成路径,并在根树节点的名称前面加上前缀,即
X
。我们不关心在这里访问右分支。为了使编译器不会抱怨,右分支的占位符branch前面写着一个
\

dfs_路径(树(X,L,R),[X|Xs]):-dif(L,void),dfs_路径(L,Xs)。
否则,如果树的右分支为non-
void
,则可以通过沿着右分支递归生成路径,并在根树节点的名称前面加上前缀,即
X
。我们不关心在这里访问左分支。为了使编译器不会抱怨,左分支的占位符branch前面写着一个
\

dfs_路径(树(X,L,R),[X|Xs]):-dif(R,void),dfs_路径(R,Xs)。
把这些放在一起,并添加一个
format/2
语句来打印正在发生的事情,我们看到Prolog通过对“树”术语应用三个规则来尝试所有可能的方法:

dfs\u路径(树(X,void,void),[X]):-
格式(“在叶'~q'~n',[X])。
dfs|u路径(树(X,L,|R),[X|Xs]):-
dif(L,无效),
格式(“在内部节点'~q'~n',[X]处向左走),
dfs_路径(L,Xs)。
dfs|u路径(树(X,|L,R),[X|Xs]):-
dif(R,void),
格式(“在内部节点'~q'~n',[X]处向下移动),
dfs_路径(R,Xs)。
树木贮藏(
树(i,,
树(a,
树(la,void,void),
树(sa,void,void)),
树(b,,
树(磅,空,空),
树(sb,void,void)))
).
运行(路径):-
tree\u存储(tree),%tree是我们预定义的树
dfs_路径(树,路径)。%A路径是通过该树的某个路径
现在运行以下命令:

?-运行(路径)。
在内部节点“i”处向左走
在内部节点“a”处向左转
在“洛杉矶”
路径=[i,a,la];
在内部节点“a”处向下移动
在叶'sa'
路径=[i,a,sa];
在内部节点“i”处向下移动
在内部节点“b”处向左转
叶“磅”
路径=[i,b,lb];
在内部节点“b”处向下移动
在“某人”的叶子上
路径=[i,b,sb];
错。

显然,我们希望通过回溯来确定从树根到其中一片叶子的所有路径

首先,必须更正树的声明:

树是一个术语,构建/编写如下(注意:每个文本元素都是小写的,否则我们将写下变量而不是常量):

树(i,
树(a,
树(la,void,void),
树(sa,void,void)),
树(b,,
树(磅,空,空),
树(某人,无效,无效))。
我们只需声明一个事实,将这棵树作为参数来存储

tree\u存储(
树(i,,
树(a,
树(la,void,void),
树(sa,void,void)),
树(b,,
树(磅,空,空),
树(sb,void,void)))
).
现在是“访问代码”

dfs\u路径(+树、?路径)
它通过
tree
给定的树构建(或验证)路径
path

如果第一个参数看起来像叶节点(即使用带有3个参数的函子
tree
构建,并且参数位置2和3上的常量
void
),则路径就是节点的名称:

dfs\u路径(树(X,void,void),[X])。
根本不需要
剪切

否则,如果树的左分支为non-
void
,则可以通过沿着左分支递归生成路径,并在根树节点的名称前面加上前缀,即
X
。我们不关心在这里访问右分支。为了使编译器不会抱怨,右分支的占位符branch前面写着一个
\

dfs\u路径(tr