Prolog逻辑编程二叉树谓词

Prolog逻辑编程二叉树谓词,prolog,Prolog,我是逻辑编程和Prolog的初学者,所以问题是我试图在Prolog中实现一个二叉树,我这样做: tree(-). tree(n(X,L,R)):- tree(L), tree(R). 现在我需要实现以下谓词 count(X,Tree,Res)。它应该计算在传递的树中给定X的次数,并以Res返回 sum(Tree,sum)。如果是数字,则应返回传递的树中所有节点的总和。 我的想法是这样的: treeSum([],0). treeSum(tree(X,T1,T2), S) :- treeS

我是逻辑编程和Prolog的初学者,所以问题是我试图在Prolog中实现一个二叉树,我这样做:

tree(-). 
tree(n(X,L,R)):- tree(L), tree(R).
现在我需要实现以下谓词

count(X,Tree,Res)。
它应该计算在传递的树中给定X的次数,并以Res返回

sum(Tree,sum)。
如果是数字,则应返回传递的树中所有节点的总和。 我的想法是这样的:

treeSum([],0).
treeSum(tree(X,T1,T2), S) :-
   treeSum(T1,S1),
   treeSum(T2,S2),
   S is X + S1 + S2.
     4
    / \
   2   5
  / \   \
 1   3   6
替换(X,Y,TreeIn,TreeOut)。
它应该将包含X的每个节点替换为Y
二叉树只是一个数据结构。我将它表示为类似于
树(L,R,V)
,其中

  • L
    是左子树
  • R
    是正确的子树,并且
  • V
    是该节点的值
从Prolog中列表的表示方式中得到一个线索,我们可以使用atom
nil
来表示一个不存在的子树,因此叶节点看起来像这棵树(nil,nil,123)

treeSum([],0).
treeSum(tree(X,T1,T2), S) :-
   treeSum(T1,S1),
   treeSum(T2,S2),
   S is X + S1 + S2.
     4
    / \
   2   5
  / \   \
 1   3   6
您将拥有以下序言结构:

tree(
  tree(
    tree(
      .,
      .,
      1
    ),
    tree(
      .,
      .,
      2
    ),
    3
  ),
  tree(
    .,
    tree(
      .,
      .,
      6
    ),
    5
  ),
  4
)
然后,你只需在树上走一走,做你想做的事。比如说,

sum( nil         , 0 ).
sum( tree(L,R,V) , S ) :-
  sum( L , SumL ),
  sum( R , SumR ),
  S is V + SumL + SumR
  .

count( _, nil, 0 ). 
count( X, tree(L,R,V), C) :-
  count(X,L,Lefts),
  count(X,R,Rights),
  ( X = V -> N = 1 ; N = 0 ) ,
  C is N  + Lefts + Rights. 

沙盒在

二叉树只是一个数据结构。我将它表示为类似于
树(L,R,V)
,其中

  • L
    是左子树
  • R
    是正确的子树,并且
  • V
    是该节点的值
从Prolog中列表的表示方式中得到一个线索,我们可以使用atom
nil
来表示一个不存在的子树,因此叶节点看起来像这棵树(nil,nil,123)

treeSum([],0).
treeSum(tree(X,T1,T2), S) :-
   treeSum(T1,S1),
   treeSum(T2,S2),
   S is X + S1 + S2.
     4
    / \
   2   5
  / \   \
 1   3   6
您将拥有以下序言结构:

tree(
  tree(
    tree(
      .,
      .,
      1
    ),
    tree(
      .,
      .,
      2
    ),
    3
  ),
  tree(
    .,
    tree(
      .,
      .,
      6
    ),
    5
  ),
  4
)
然后,你只需在树上走一走,做你想做的事。比如说,

sum( nil         , 0 ).
sum( tree(L,R,V) , S ) :-
  sum( L , SumL ),
  sum( R , SumR ),
  S is V + SumL + SumR
  .

count( _, nil, 0 ). 
count( X, tree(L,R,V), C) :-
  count(X,L,Lefts),
  count(X,R,Rights),
  ( X = V -> N = 1 ; N = 0 ) ,
  C is N  + Lefts + Rights. 

沙箱位于

OP表示树(T):-T=n(X,L,R);T='-'。,你说的是
tree(T):-T=tree(L,R,V);T=nil。
。感谢您的回答,我的树数据结构必须以这种方式实现,树(n(X,L,R)):-tree(L),tree(R),tree(L,R,V)是不允许的;T='-'。,你说的是
tree(T):-T=tree(L,R,V);T=nil。
。感谢您的回答,我的树数据结构必须以这种方式实现树(n(X,L,R)):-tree(L),tree(R),tree(L,R,V)是不允许的。