Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在prolog中遍历树_Prolog - Fatal编程技术网

在prolog中遍历树

在prolog中遍历树,prolog,Prolog,有人能帮我解决Prolog中的一个问题吗。我想按顺序遍历一棵树。我设法用后序的方式来做,因为它看起来更小口,但我不知道如何改变它的顺序。我只是假设我的代码可以工作,因为我不知道如何在目标部分声明树。谁能帮帮我吗。以下是我目前的代码: domains elem=integer tree=tr(elem,tree,tree);nil list=elem* predicates preorder(tree,list) conc(list,list,list) clauses c

有人能帮我解决Prolog中的一个问题吗。我想按顺序遍历一棵树。我设法用后序的方式来做,因为它看起来更小口,但我不知道如何改变它的顺序。我只是假设我的代码可以工作,因为我不知道如何在目标部分声明树。谁能帮帮我吗。以下是我目前的代码:

domains
  elem=integer
  tree=tr(elem,tree,tree);nil
  list=elem*
predicates
  preorder(tree,list)
  conc(list,list,list)
clauses
  conc([],L,L).
  conc([X|L1],L2,[X|L3]):-
                          conc(L1,L2,L3). 
  preorder(nil,[]).
  preorder(tr(R,LEFT,RIGHT),L):-
    preorder(RIGHT,L1),
    preorder(LEFT,L2),
    conc([R],L2,L3),
    conc(L3,L1,L)

.

部分,您似乎需要更改

preorder(arb(R,LEFT,RIGHT),L):-
  ...

编辑基本上,访问顺序是没有影响的,因为您没有“做”任何与树的数据。。。您只需更改conc即可获得顺序列表。为了便于讨论,让我们重命名谓词(记住在
predicates
部分声明它):

屈服

11 ?- inorder(tr(1,tr(2,tr(4,nil,nil),nil),tr(3,nil,nil)),L).
L = [4, 2, 1, 3].

部分,您似乎需要更改

preorder(arb(R,LEFT,RIGHT),L):-
  ...

编辑基本上,访问顺序是没有影响的,因为您没有“做”任何与树的数据。。。您只需更改conc即可获得顺序列表。为了便于讨论,让我们重命名谓词(记住在
predicates
部分声明它):

屈服

11 ?- inorder(tr(1,tr(2,tr(4,nil,nil),nil),tr(3,nil,nil)),L).
L = [4, 2, 1, 3].

这只是一个语法错误,我更改了英文名称,因为它们是另一种语言,所以可以理解。我不知道怎么做,我应该在目标部分放什么?我没有winprolog可供测试,但我认为应该是
GOAL-preorder(tr(1,nil,nil),L)。
它显示了[1]。如果我想写一棵更大的树,比如1->[2,3->[5->[8,9],6->[10]],4->[10]]我该怎么做?好的,帮我举一个简单的例子,说明1->[1,2]请
前序(tr(1,tr(2,nil,nil),tr(3,nil,nil))
这只是一个语法错误,我已经更改了英文名称,因为它们是另一种语言,所以可以理解。我不知道怎么做,我应该在目标部分放什么?我没有winprolog可供测试,但我认为应该是
GOAL-preorder(tr(1,nil,nil),L)。
它显示了[1]。如果我想写一个更大的树,比如1->[2,3->[5->[8,9],6->[10],4->[10]],我该怎么做?好的,请帮我举一个简单的例子来说明1->[1,2],请
预排序(tr(1,tr(2,nil,nil),tr(3,nil,nil))