From 4b4d735095fd9fe22ba7d520be08199380de4b73 Mon Sep 17 00:00:00 2001 From: jfschaefer <jfschaefer@outlook.com> Date: Mon, 4 Nov 2019 18:02:03 +0100 Subject: [PATCH] prolog tree stuff --- Frederik/README.md | 3 +- Frederik/prolog/2019-11-04-trees.pl | 61 +++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 Frederik/prolog/2019-11-04-trees.pl diff --git a/Frederik/README.md b/Frederik/README.md index 4533f32..20bf576 100644 --- a/Frederik/README.md +++ b/Frederik/README.md @@ -5,4 +5,5 @@ AI 1 - 2019/2020 --- * 2019-10-28: `prolog/2019-10-28-tutorial.pl` (simple prolog exercises) -* 2019-10-31: `prolog/2019-10-31-tutorial.pl` (simple prolog exercises) +* 2019-10-31 (substition for Katja): `prolog/2019-10-31-tutorial.pl` (simple prolog exercises) +* 2019-11-04: `prolog/2019-11-04-trees.pl` (some simple tree exercises) diff --git a/Frederik/prolog/2019-11-04-trees.pl b/Frederik/prolog/2019-11-04-trees.pl new file mode 100644 index 0000000..2c22b60 --- /dev/null +++ b/Frederik/prolog/2019-11-04-trees.pl @@ -0,0 +1,61 @@ +% Check that a tree is indeed a binary tree +% (as specified in the homework) +isbinary(nil). +isbinary(tree(N, X, Y)) :- + integer(N), + isbinary(X), + isbinary(Y). + +% Helper predicate: get the maximum of two integers +% e.g max(2,7,X) results in X=7. +% +% ! is the cut operator. +% It tells prolog not to backtrack anymore. +% In this case, we want to ignore the second case, +% if the first case is applicable. +max(X,Y,X) :- X >= Y, !. +max(_,Y,Y). + +% Get the largest node in a tree +% (assuming it only contains natural numbers) +treemax(nil, 0). +treemax(tree(N, X, Y), Result) :- + treemax(X, XRes), + treemax(Y, YRes), + max(XRes, YRes, XYRes), + max(XYRes, N, Result). + +% Get the depth of a tree +treedepth(nil, 0). +treedepth(tree(_, X, Y), Depth) :- + treedepth(X, XDepth), + treedepth(Y, YDepth), + max(XDepth, YDepth, D), + Depth is D + 1. + +% helper predicate: concatenate two lists +concatenate([], L, L). +concatenate([H|T], L, [H|TL]) :- + concatenate(T, L, TL). + +% get the leaves of a binary tree +leaves(nil, []). +leaves(tree(N, nil, nil), [N]) :- !. +leaves(tree(N, X, Y), Result) :- + leaves(X, XL), + leaves(Y, YL), + concatenate(XL, YL, Result). + +% compute the result of a formula (which you can think of as a tree). +% Example tree: plus(times(2,6), 7) +compute(SomeInt, SomeInt) :- + integer(SomeInt). +compute(times(X, Y), R) :- + compute(X, XRes), + compute(Y, YRes), + R is XRes * YRes. +compute(plus(X, Y), R) :- + compute(X, XRes), + compute(Y, YRes), + R is XRes + YRes. + -- GitLab