Пролог - проверка, упорядочено ли двоичное дерево или нет - PullRequest
0 голосов
/ 04 января 2012

Я хочу написать программу на Прологе, которая подтверждает, упорядочено ли 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)))).

Огромное спасибо.

Ответы [ 2 ]

0 голосов
/ 05 июля 2012
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)
    .

Результат: да

0 голосов
/ 04 января 2012

Используя ту же древовидную структуру, что и раньше (атом 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) )
        .
      
...