88 lines
1.8 KiB
Plaintext
88 lines
1.8 KiB
Plaintext
nat: type.
|
|
z: nat.
|
|
s: nat -> nat.
|
|
%name nat N.
|
|
%freeze nat.
|
|
|
|
max: nat -> nat -> nat -> type.
|
|
%mode max +N1 +N2 -N3.
|
|
max/z1: max z N N.
|
|
max/z2: max N z N.
|
|
max/s: max N M P -> max (s N) (s M) (s P).
|
|
%worlds () (max _ _ _).
|
|
%total N (max N _ _).
|
|
%
|
|
% As long as one of N1 and N2 get smaller.
|
|
% A twelf feature that's not well-documented
|
|
% %total [N1 N2] (max N1 N2 _).
|
|
|
|
|
|
% A skeleton tree. ie, with no data.
|
|
tree: type.
|
|
leaf: tree.
|
|
node: tree -> tree -> tree.
|
|
%freeze tree.
|
|
%name tree T.
|
|
|
|
height: tree -> nat -> type.
|
|
%mode height +T -N.
|
|
|
|
height/leaf: height leaf z.
|
|
height/node
|
|
: height (node L R) (s H)
|
|
<- height L HL
|
|
<- height L HR
|
|
<- max HL HR H.
|
|
|
|
%worlds () (height _ _).
|
|
%total T (height T _).
|
|
|
|
|
|
balanced: tree -> type.
|
|
balanced/leaf: balanced leaf.
|
|
balanced/node
|
|
: balanced (node L R)
|
|
<- height L H
|
|
<- height R H.
|
|
% Wow.. that's cool.
|
|
|
|
|
|
% >>> %solve - : balanced (node leaf leaf).
|
|
% OK
|
|
% - : balanced (node leaf leaf) = balanced/node height/leaf height/leaf.
|
|
|
|
% >>> %solve - : balanced (node leaf (node leaf leaf)).
|
|
% No solution to %solve found
|
|
|
|
tree1: tree = node leaf leaf.
|
|
|
|
% >>> %solve - : balanced tree1.
|
|
% OK
|
|
% - : balanced tree1 = balanced/node height/leaf height/leaf.
|
|
|
|
% >>> %solve - : balanced (node tree1 tree1).
|
|
% OK
|
|
% - : balanced (node tree1 tree1)
|
|
% = balanced/node (height/node max/z1 height/leaf height/leaf)
|
|
% (height/node max/z1 height/leaf height/leaf).
|
|
|
|
bbt: nat -> type.
|
|
bLeaf: bbt z.
|
|
bNode: bbt N -> bbt N -> bbt (s N).
|
|
|
|
%solve egtree1: bbt (s (s (s z))).
|
|
|
|
eqTree: bbt N -> bbt N -> type.
|
|
%mode eqTree +T1 +T2.
|
|
eqTree/bLeaf: eqTree bLeaf bLeaf.
|
|
eqTree/bNode
|
|
: eqTree (bNode L1 R1) (bNode L2 R2)
|
|
<- eqTree L1 L2
|
|
<- eqTree R1 R2.
|
|
%worlds () (eqTree _ _).
|
|
%total [T1 T2] (eqTree T1 T2).
|
|
|
|
|
|
% % This doesn't work???? Even if it doesn't give error.
|
|
% eqTree2: bbt N -> bbt N -> type.
|
|
% eqTree2/i: eqTree2 N N. |