playground/twelf/chris/w2/w2-live.elf

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.