[2] | 1 | #!/usr/bin/env swipl -s
|
---|
| 2 |
|
---|
| 3 | /*
|
---|
| 4 | * Rick van der Zwet
|
---|
| 5 | * 0433373
|
---|
| 6 | * Prolog programming assigment 2
|
---|
| 7 | * Licence: BSD
|
---|
| 8 | * $Id: assignment2.pro 299 2007-11-08 00:10:31Z rick $
|
---|
| 9 | *
|
---|
| 10 | * We shall consider binary trees whose nodes are (labelled with)
|
---|
| 11 | * natural numbers, and use the term void to denote the empty tree, and
|
---|
| 12 | * the term tree(x, left, right). to denote the tree with root x, left
|
---|
| 13 | * subtree left and right subtree right. For example, the term tree(1,
|
---|
| 14 | * tree(2, void, void), tree(3, void, void)) represents the tree with
|
---|
| 15 | * root 1 and children 2 and 3
|
---|
| 16 | * We call a binary tree tree(x, left, right) nice if:
|
---|
| 17 | * 1. if left is not empty then x is greater than all the elements in
|
---|
| 18 | * left
|
---|
| 19 | * 2. if right is not empty then x is less than all the elements in
|
---|
| 20 | * right.
|
---|
| 21 | *
|
---|
| 22 | * A binary tree is called a search tree if every subtree of it is nice.
|
---|
| 23 | * Write a program which tests whether a ground term is a search tree.
|
---|
| 24 | *
|
---|
| 25 | * Hint: Use the following predicate is_search_tree(T) in the definition
|
---|
| 26 | * of search tree:
|
---|
| 27 | * is_search_tree(void).
|
---|
| 28 | * is_search_tree(T) :- is_search_tree(T, Min, Max).
|
---|
| 29 | * where Min and Max are the minimum and maximum element of the tree T.
|
---|
| 30 | * Then implement the predicate is_search_tree(T, Min, Max).
|
---|
| 31 | */
|
---|
| 32 |
|
---|
| 33 |
|
---|
| 34 | /* Make a call to a void/2 fail to make the once(call( fail when calling
|
---|
| 35 | * the void X X
|
---|
| 36 | */
|
---|
| 37 | void(_, _) :-
|
---|
| 38 | fail.
|
---|
| 39 |
|
---|
| 40 | /* Calculate wether leaf is valid */
|
---|
| 41 | tree(X, void, void, Min, Max) :-
|
---|
| 42 | X =< Max,
|
---|
| 43 | X >= Min.
|
---|
| 44 |
|
---|
| 45 | /* Only Left set, make the call */
|
---|
| 46 | tree(X, Left, void, Min, _) :-
|
---|
| 47 | once(call(Left, Min, X)).
|
---|
| 48 |
|
---|
| 49 | /* Only Right set, make the call */
|
---|
| 50 | tree(X, void, Right, _, Max) :-
|
---|
| 51 | once(call(Right, X, Max)).
|
---|
| 52 |
|
---|
| 53 | /* Both set, make the call */
|
---|
| 54 | tree(X, Left, Right, Min, Max) :-
|
---|
| 55 | once(call(Left, Min, X)),
|
---|
| 56 | once(call(Right, X, Max)).
|
---|
| 57 |
|
---|
| 58 | /* Initial values */
|
---|
| 59 | tree(X, Left, Right) :-
|
---|
| 60 | tree(X, Left, Right, -32768, 32768).
|
---|
| 61 |
|
---|
| 62 | /* Exception single tree node */
|
---|
| 63 | tree(_, void, void) :-
|
---|
| 64 | true.
|
---|
| 65 |
|
---|
| 66 | /* Exception no node */
|
---|
| 67 | is_search_tree(void).
|
---|
| 68 |
|
---|
| 69 | is_search_tree(T) :-
|
---|
| 70 | once(call(T)).
|
---|