add some files from chris course

This commit is contained in:
Julin S 2024-04-10 17:21:34 +05:30
parent 4380c7c126
commit e4d7f2e22d
7 changed files with 356 additions and 0 deletions

86
twelf/chris/w1/hw.elf Normal file
View File

@ -0,0 +1,86 @@
nat: type.
z: nat.
s: nat -> nat.
%{
>>> bogus: nat.
}%
even: nat -> type.
odd: nat -> type.
even/z: even z.
even/s: even (s N) <- odd N.
odd/s: odd (s N) <- even N.
%solve - : even (s (s (s (s z)))).
%{
>>> %solve - : even bogus.
hw.elf:19.2-19.23 Error:
No solution to %solve found
>>> %solve - : even (s (s (s z))).
No solution to %solve found
>>> %solve even (s (s (s (s z)))).
OK
- : even (s (s (s (s z)))) = even/s (odd/s (even/s (odd/s even/z))).
}%
% Standalone even
even': nat -> type.
even'/z: even' z.
even'/s: even' (s (s N)) <- even' N.
% =========================================
% even' N -> even N
% =========================================
even'-impl-even: even' N -> even N -> type.
%mode even'-impl-even +X1 -X2.
even'-impl-even/z : even'-impl-even
even'/z
even/z.
even'-impl-even/s : even'-impl-even
(even'/s (D1': even' N))
(even/s (odd/s D1))
<- even'-impl-even D1' D1.
% =========================================
% even N -> even' N
% =========================================
even-impl-even': even N -> even' N -> type.
%mode even-impl-even' +X1 -X2.
even-impl-even'/z : even-impl-even'
even/z even'/z.
even-impl-even'/s: even-impl-even'
(even/s (D1: odd N))
(even'/s D2).
% even-impl-even'/s: even-impl-even'
% (even/s (D1: odd N))
% D2
% % (even'/s D2)
% <- even-impl-even' (even/s D1) D3.
% =========================================
% Every nat is either even or odd
% =========================================
nat-eod: nat -> type.
nat-eod/e: nat-eod N <- even N.
nat-eod/o: nat-eod N <- odd N.
step: nat-eod N -> nat-eod (s N).
step/z: nat-eod z -> nat-eod (s z).

45
twelf/chris/w1/hw2.elf Normal file
View File

@ -0,0 +1,45 @@
nat: type.
z: nat.
s: nat -> nat.
even2: nat -> type.
odd: nat -> type.
even2/z: even2 z.
even2/s: even2 (s N) <- odd N.
odd/s: odd (s N) <- even2 N.
% Standalone even
even: nat -> type.
even/z: even z.
even/s: even (s (s N)) <- even N.
% =========================================
% even2 N -> even N
% =========================================
even2-impl-even: even2 N -> even N -> type.
%mode even2-impl-even +X1 -X2.
even2-impl-even/z : even2-impl-even
even2/z even/z.
even2-impl-even/s : even2-impl-even
(even2/s (odd/s (D1: even2 N)))
(even/s D2)
<- even2-impl-even D1 D2.
% =========================================
% Every nat is either even or odd
% =========================================
nat-eod: nat -> type.
nat-eod/e: nat-eod N <- even N.
nat-eod/o: nat-eod N <- odd N.
step: nat-eod N -> nat-eod (s N).
step/z: nat-eod z -> nat-eod (s z).
% ∃X, X + 1 = 2

82
twelf/chris/w1/nat.elf Normal file
View File

@ -0,0 +1,82 @@
% 30-Jan-2024
nat: type.
z: nat.
s: nat -> nat.
% Make twelf output use N as name for vals of nat in output
%name nat N.
%%%%%%%%%%%%%%%%%%%%
even: nat -> type.
even/z: even z.
even/s: even (s (s N)) <- even N.
% even/s: even N -> even (s (s N)).
%%%%%%%%%%%%%%%%%%%%
even2: nat -> type.
odd: nat -> type.
odd/s: odd (s N) <- even2 N.
even2/z: even2 z.
even2/s: even2 (s N) <- odd N.
%solve myEvenDeriv: even (s (s z)).
% myEvenDeriv : even (s (s z)) = even/s even/z.
% %solve myEvenDeriv: even (s (s (s z))).
% No solution to %solve found
%%%%%%%%%%%%%%%%%%%%
even-implies-even2: even N -> even2 N -> type.
%mode even-implies-even2 +X1 -X2.
even-implies-even2/z
: even-implies-even2 even/z even2/z.
even-implies-even2/s
: even-implies-even2
(even/s (Deven: even N))
(even2/s (odd/s Deven2))
<- even-implies-even2 Deven (Deven2: even2 N).
%worlds () (even-implies-even2 _ _).
%total D (even-implies-even2 D _).
%%%%%%%%%%%%%%%%%%%%%%
even2-implies-even: even2 N -> even N -> type.
%mode even2-implies-even +X1 -X2.
even2-implies-even/z
: even2-implies-even even2/z even/z.
even2-implies-even/s
: even2-implies-even
(even2/s (Deven: even N))
(even2/s (Deven: even2 N))
%%%%%%%%%%%%%%%%%%%%%%
% Yeah, unicode seems to be fine.
% sml doesn't support unicode I guess. Apparently, twelf source treats
% all non-ascii as lower-case letter
: type.
%%%%%%%%%%%%%%%%%%%%%%
plus: nat -> nat -> nat -> type.
%mode plus +N1 +N2 -N3.
plus/z: plus z N N.
plus/s: plus (s N1) N2 (s N3) <- plus N1 N2 N3.
% Error
% plus-comm: plus N1 (plus N2 N3) N4 -> plus (plus N1 N2) N3 N4 -> type.

View File

@ -0,0 +1 @@
nat.elf

52
twelf/chris/w2/hw.elf Normal file
View File

@ -0,0 +1,52 @@
% ---
% nat
% ===
nat: type.
z: nat.
s: nat -> nat.
%name nat N.
%freeze nat.
% -------------------
% Maximum of two nats
% ===================
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 _ _).
% --------------
% Tree structure
% ==============
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 _).
% --------
% AVL tree
% ========
avl: type.
avlLeaf: avl.
avlNode: nat -> tree -> tree -> avl.
% nat is the balance factor

View File

@ -0,0 +1,2 @@
w2-live.elf
hw.elf

View File

@ -0,0 +1,88 @@
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.