source: liacs/cvp/prolog/assignment2.pro@ 4

Last change on this file since 4 was 2, checked in by Rick van der Zwet, 15 years ago

Initial import of data of old repository ('data') worth keeping (e.g. tracking
means of URL access statistics)

  • Property svn:executable set to *
File size: 2.0 KB
RevLine 
[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 */
37void(_, _) :-
38 fail.
39
40/* Calculate wether leaf is valid */
41tree(X, void, void, Min, Max) :-
42 X =< Max,
43 X >= Min.
44
45/* Only Left set, make the call */
46tree(X, Left, void, Min, _) :-
47 once(call(Left, Min, X)).
48
49/* Only Right set, make the call */
50tree(X, void, Right, _, Max) :-
51 once(call(Right, X, Max)).
52
53/* Both set, make the call */
54tree(X, Left, Right, Min, Max) :-
55 once(call(Left, Min, X)),
56 once(call(Right, X, Max)).
57
58/* Initial values */
59tree(X, Left, Right) :-
60 tree(X, Left, Right, -32768, 32768).
61
62/* Exception single tree node */
63tree(_, void, void) :-
64 true.
65
66/* Exception no node */
67is_search_tree(void).
68
69is_search_tree(T) :-
70 once(call(T)).
Note: See TracBrowser for help on using the repository browser.