Conor lecture experiments

This commit is contained in:
Smaug123
2019-02-04 07:48:26 +00:00
parent ecde6acce4
commit f63db714c6

276
Experiments.agda Normal file
View File

@@ -0,0 +1,276 @@
{-# OPTIONS --safe --warning=error #-}
open import LogicalFormulae
open import Agda.Primitive using (Level; lzero; lsuc; _⊔_)
open import Numbers.Naturals
open import Lists
open import Vectors
module Experiments where
record One : Set where
ListF : (A : Set) (T : Set) Set
ListF A T = One || A && T
Choose : {I J : Set} -> (I -> Set) -> (J -> Set) -> (I || J) -> Set
Choose X Y (inl i) = X i
Choose X Y (inr j) = Y j
data Poly (X : Set) : Set where
var' : X -> Poly X
konst' : Bool -> Poly X
_+'_ _*'_ : Poly X -> Poly X -> Poly X
Eval : {X : Set} -> (X -> Set) -> Poly X -> Set
Eval elems (var' x) = elems x
Eval elems (konst' BoolTrue) = One
Eval elems (konst' BoolFalse) = False'
Eval elems (poly +' poly1) = Eval elems poly || Eval elems poly1
Eval elems (poly *' poly1) = Eval elems poly && Eval elems poly1
data MU {elements nodes : Set} (nodeStructure : nodes Poly (elements || nodes)) (elems : elements Set) (topNode : nodes) : Set where
<_> : Eval (Choose elems (MU nodeStructure elems)) (nodeStructure topNode) MU nodeStructure elems topNode
polyMap : {X Y : Set} (f : X Y) Poly X Poly Y
polyMap f (var' x) = var' (f x)
polyMap f (konst' x) = konst' x
polyMap f (p +' q) = polyMap f p +' polyMap f q
polyMap f (p *' q) = polyMap f p *' polyMap f q
-- Naturals
natF : Poly One
natF = konst' BoolTrue +' var' (record {})
natF' : Poly (False || One)
natF' = polyMap (λ _ inr (record {})) natF
nats : Set
nats = MU {False} {One} (λ _ natF') (λ ()) (record {})
f : nats
f < inl record {} > = 0
f < inr x > = succ (f x)
g : nats
g zero = < inl (record {}) >
g (succ n) = < inr (g n) >
fgId : {n : } f (g n) n
fgId {zero} = refl
fgId {succ n} rewrite fgId {n} = refl
gfId : {n : nats} g (f n) n
gfId {< inl record {} >} = refl
gfId {< inr x >} rewrite gfId {x} = refl
-- Lists
listF : Poly (One || One)
listF = konst' BoolTrue +' (var' (inl (record {})) *' var' (inr record {}))
lists : (A : Set) Set
lists A = MU {One} {One} (λ _ listF) (λ _ A) record {}
h : {A : Set} lists A List A
h {A} < inl record {} > = []
h {A} < inr (fst ,, snd) > = fst :: h snd
i : {A : Set} List A lists A
i {A} [] = < inl record {} >
i {A} (x :: l) = < inr (x ,, i l) >
hiId : {A : Set} (r : List A) h (i r) r
hiId [] = refl
hiId (x :: r) rewrite hiId r = refl
ihId : {A : Set} (r : lists A) i (h r) r
ihId < inl record {} > = refl
ihId < inr (fst ,, snd) > rewrite ihId snd = refl
-- Vectors
vecF : Poly (One || )
vecF zero = konst' BoolTrue
vecF (succ n) = var' (inl (record {})) *' var' (inr n)
vecs : (A : Set) (n : ) Set
vecs A n = MU vecF (λ _ A) n
j : {A : Set} {n : } vecs A n Vec A n
j {A} {zero} < record {} > = []
j {A} {succ n} < fst ,, snd > = fst ,- j snd
k : {A : Set} {n : } Vec A n vecs A n
k {A} {.0} [] = < record {} >
k {A} {.(succ _)} (x ,- v) = < x ,, k v >
jkId : {A : Set} {n : } {v : Vec A n} j (k v) v
jkId {A} {zero} {[]} = refl
jkId {A} {succ n} {x ,- v} rewrite jkId {v = v} = refl
kjId : {A : Set} {n : } {v : vecs A n} k (j v) v
kjId {n = zero} {< record {} >} = refl
kjId {n = succ n} {< fst ,, snd >} rewrite kjId {v = snd} = refl
-- Vectors where even-numbered places are pairs
evenQ : Bool
evenQ 0 = BoolTrue
evenQ (succ n) = not (evenQ n)
data VecWeird {a : _} (A : Set a) : Set a where
empty : VecWeird A 0
consEven : {n : } VecWeird A n (evenQ n BoolFalse) (A && A) (VecWeird A (succ n))
consOdd : {n : } VecWeird A n (evenQ n BoolTrue) A (VecWeird A (succ n))
example : VecWeird 4
example = consEven {n = 3} (consOdd (consEven (consOdd empty refl 4) refl (3 ,, 3)) refl 2) refl (1 ,, 1)
vecWeirdF : ( && Bool) Poly (One || ( && Bool))
vecWeirdF (zero ,, BoolTrue) = konst' BoolTrue
vecWeirdF (zero ,, BoolFalse) = konst' BoolFalse
vecWeirdF ((succ n) ,, BoolTrue) = (var' (inl (record {})) *' var' (inl (record {}))) *' var' (inr (n ,, BoolFalse))
vecWeirdF ((succ n) ,, BoolFalse) = var' (inl (record {})) *' var' (inr (n ,, BoolTrue))
vecWeirds : (A : Set) (n : ) Set
vecWeirds A n = MU vecWeirdF (λ _ A) (n ,, evenQ n)
vecWeirdsEq : {A : Set} {n : } VecWeird A n vecWeirds A n
vecWeirdsEq empty = < record {} >
vecWeirdsEq {n = .succ n} (consEven v pr (x ,, y)) with inspect (evenQ n)
vecWeirdsEq {_} {.(succ _)} (consEven v s (x ,, y)) | BoolTrue with p rewrite p = exFalso (q s)
where
q : (BoolTrue BoolFalse) False
q ()
vecWeirdsEq {A} {succ n} (consEven v _ (x ,, y)) | BoolFalse with p rewrite p = < (x ,, y) ,, typeCast (vecWeirdsEq v) (applyEquality (MU vecWeirdF (λ _ A)) b) >
where
b : (n ,, evenQ n) (n ,, BoolFalse)
b rewrite p = refl
vecWeirdsEq {_} {succ n} (consOdd v pr x) with inspect (evenQ n)
vecWeirdsEq {A} {succ n} (consOdd v pr x) | BoolTrue with _ rewrite pr = < x ,, typeCast (vecWeirdsEq v) (applyEquality (MU vecWeirdF (λ _ A)) b) >
where
b : (n ,, evenQ n) (n ,, BoolTrue)
b rewrite pr = refl
vecWeirdsEq {_} {succ n} (consOdd v pr x) | BoolFalse with q rewrite q = exFalso (r pr)
where
r : (BoolFalse BoolTrue) False
r ()
vecWeirdsEq' : {A : Set} {n : } vecWeirds A n VecWeird A n
vecWeirdsEq' {n = zero} < x > = empty
vecWeirdsEq' {n = succ n} < x > with inspect (evenQ n)
vecWeirdsEq' {A} {succ n} < x > | BoolTrue with p = ans
where
y : Eval (Choose (λ _ A) (MU vecWeirdF (λ _ A))) (vecWeirdF (succ n ,, BoolFalse))
y = typeCast x (applyEquality (λ i Eval (Choose (λ _ A) (MU vecWeirdF (λ _ A))) (vecWeirdF (succ n ,, not i))) p)
ans : VecWeird A (succ n)
ans with y
ans | fst ,, snd = consOdd (vecWeirdsEq' insert) p fst
where
insert : vecWeirds A n
insert = typeCast snd (applyEquality (λ i MU vecWeirdF (λ _ A) (n ,, i)) (equalityCommutative p))
vecWeirdsEq' {A} {succ n} < x > | BoolFalse with p = ans
where
y : Eval (Choose (λ _ A) (MU vecWeirdF (λ _ A))) (vecWeirdF (succ n ,, BoolTrue))
y = typeCast x (applyEquality (λ i Eval (Choose (λ _ A) (MU vecWeirdF (λ _ A))) (vecWeirdF (succ n ,, not i))) p)
ans : VecWeird A (succ n)
ans with y
ans | fst ,, snd = consEven (vecWeirdsEq' insert) p fst
where
insert : vecWeirds A n
insert = typeCast snd (applyEquality (λ i MU vecWeirdF (λ _ A) (n ,, i)) (equalityCommutative p))
vecWeirdsEquiv : {A : Set} {n : } {v : vecWeirds A n} vecWeirdsEq (vecWeirdsEq' v) v
vecWeirdsEquiv {A} {zero} {< record {} >} = refl
vecWeirdsEquiv {A} {succ n} {< x >} with inspect (evenQ n)
vecWeirdsEquiv {A} {succ n} {< x >} | BoolTrue with pr = {!!}
vecWeirdsEquiv {A} {succ n} {< x >} | BoolFalse with pr = {!!}
vecWeirdsEquiv' : {A : Set} {n : } {v : VecWeird A n} vecWeirdsEq' (vecWeirdsEq v) v
vecWeirdsEquiv' {A} {zero} {empty} = refl
vecWeirdsEquiv' {A} {succ n} {consEven v x pr} with inspect (evenQ n)
vecWeirdsEquiv' {A} {succ n} {consEven v x pr} | BoolTrue with pr' = exFalso (fa x)
where
fa : (evenQ n BoolFalse) False
fa a rewrite pr' = b a
where
b : BoolTrue BoolFalse False
b ()
vecWeirdsEquiv' {A} {succ n} {consEven v pr (fst ,, snd)} | BoolFalse with pr' with vecWeirdsEquiv' {A} {n} {v}
... | bl = {!!}
vecWeirdsEquiv' {A} {succ n} {consOdd v x pr} = {!!}
-- Trees
treeF : Poly (One || One)
treeF = konst' BoolTrue +' (var' (inl (record {})) *' (var' (inr record {}) *' var' (inr record {})))
trees : (A : Set) Set
trees A = MU (λ _ treeF) (λ _ A) record {}
data Tree {a : _} (A : Set a) : Set a where
emptyTree : Tree A
branch : Tree A Tree A A Tree A
treeEq : {A : Set} trees A Tree A
treeEq < inl x > = emptyTree
treeEq < inr (x ,, (branch1 ,, branch2)) > = branch (treeEq branch1) (treeEq branch2) x
treeEq' : {A : Set} Tree A trees A
treeEq' emptyTree = < inl (record {}) >
treeEq' (branch left right x) = < inr (x ,, (treeEq' left ,, treeEq' right)) >
treeEqId : {A : Set} {t : Tree A} treeEq (treeEq' t) t
treeEqId {t = emptyTree} = refl
treeEqId {t = branch left right x} rewrite treeEqId {t = left} | treeEqId {t = right} = refl
treeEqId' : {A : Set} {t : trees A} treeEq' (treeEq t) t
treeEqId' {t = < inl record {} >} = refl
treeEqId' {t = < inr (a ,, (left ,, right)) >} rewrite treeEqId' {t = left} | treeEqId' {t = right} = refl
-- Expressions
data Expr : (A : Set) Set where
constant : (A : Set) A Expr A
plus : (a b : Expr ) Expr
negate : (a : Expr Bool) Expr Bool
data ExprType : Set where
nat : ExprType
bool : ExprType
a : ExprType
data NodeType : Set where
const' : NodeType
plus' : NodeType
negate' : NodeType
exprF : NodeType Poly (ExprType || NodeType)
exprF const' = var' (inl a)
exprF plus' = var' (inr {!!}) *' var' (inr {!!})
exprF negate' = var' (inr {!!})
exprShapes : (A : Set) ExprType Set
exprShapes A nat = A
exprShapes _ bool = &&
exprShapes _ a = Bool
exprs : (A : Set) Set
exprs A = MU {ExprType} {NodeType} exprF (exprShapes A) const'
exprsEq : {A : Set} Expr A exprs A
exprsEq (constant A x) = < {!!} >
exprsEq (plus e1 e2) with exprsEq e1
exprsEq (plus e1 e2) | a1 with exprsEq e2
exprsEq (plus e1 e2) | < x > | < y > = < {!!} >
exprsEq (negate e) with exprsEq e
... | < toNegate > = < not toNegate >
exprsEq' : {A : Set} exprs A Expr A
exprsEq' < x > = {!!}
exprsEqId : {A : Set} {e : Expr A} exprsEq' (exprsEq e) e
exprsEqId {e = constant A x} = {!!}
exprsEqId {e = plus x y} with exprsEq x
exprsEqId {_} {plus x y} | < x1 > with exprsEq y
exprsEqId {_} {plus x y} | < x1 > | < y1 > = {!!}
exprsEqId {e = negate e} = {!!}
exprsEqId' : {A : Set} {e : exprs A} exprsEq (exprsEq' e) e
exprsEqId' {e = e} = {!!}