Prolog逻辑编程二叉树谓词
我是逻辑编程和Prolog的初学者,所以问题是我试图在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
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
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
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)是不允许的。