我想在Prolog中编写一个程序,确认是否订购了整数的b树。订单从小到大。 这是我到目前为止所写的内容,但我没有做任何可靠的工作。有人知道怎么做吗?
Domains
element=integer
tree=a(tree,element,tree);void
Predicates
nondeterm ordre(tree)
Clauses
order(a(_,Node,a(_,Node2,_))):-Node<Node2.
order(a(Esq,Node,Dre)) :-
order(Esq),
write(Node),nl,
order(Dre).
Goal
order(a(a(void,1,void),2,a(a(void,3,void),4,a(void,6,void)))).
非常感谢。
答案 0 :(得分:0)
domains
element = integer
arbre = a (arbre, element, arbre) ; buit
predicates
nondeterm ordenat (arbre)
nondeterm ordenat2 (arbre, element)
clauses
ordenat2 (a (buit, E, buit), E).
ordenat2 (a (buit, E, R), MR) :-
ordenat2 (R, MR),
E<MR.
ordenat2 (a (L, E, buit), E) :-
ordenat2 (L, ML),
ML<E.
ordenat2 (a (L, E, R), MR) :-
ordenat2 (L, ML), ML<E,
ordenat2 (R, MR), E<MR.
ordenat (A) :-
ordenat2 (A, _).
goal
B=a (a (a (buit, 1, buit), 2, a (buit, 3, buit)), 4, a (a (buit, 5, buit), 6, a (buit, 7, buit))),
ordenat (B)
.
结果:是的
答案 1 :(得分:-1)
使用与之前相同的树结构(原子btree
表示空树;结构btree(Key,Left,Right)
表示非空树,这样的事情应该是这样的:
根据定义排序空树
is_ordered( btree ).
如果
,则会订购非空树订购了正确的子项,其键大于当前节点的键
is_ordered( btree( K , L , R ) ) :-
is_ordered( L < K ) ,
is_ordered( R > K )
.
根据定义,空树小于任何指定的键值,也大于任何指定的键值。
is_ordered( btree < K ).
is_ordered( btree > K ).
如果
,则非空树小于指定的键值它本身是有序的
is_ordered( btree(K1,L,R) < K ) :-
K1 < K ,
is_ordered( btree(K1,L,R) )
.
如果
,则非空树大于指定的键值它本身是有序的
is_ordered( btree(K1,L,R) > K ) :-
K1 > K ,
is_ordered( btree(K1,L,R) )
.