mirror of https://github.com/nmvdw/HITs-Examples
Expressions
This commit is contained in:
parent
14cf6c1031
commit
16f1ab86cb
|
@ -0,0 +1,204 @@
|
|||
Require Import HoTT.
|
||||
|
||||
Local Open Scope nat_scope.
|
||||
|
||||
(*
|
||||
Expressions with natural numbers and +.
|
||||
*)
|
||||
Section plus.
|
||||
|
||||
Private Inductive ExpP : Type :=
|
||||
| val : nat -> ExpP
|
||||
| plus : ExpP -> ExpP -> ExpP.
|
||||
|
||||
Axiom addE : forall n m, plus (val n) (val m) = val (n + m).
|
||||
|
||||
Fixpoint ExpP_ind
|
||||
(Y : ExpP -> Type)
|
||||
(vY : forall n : nat, Y(val n))
|
||||
(pY : forall e1 e2 : ExpP, Y e1 -> Y e2 -> Y (plus e1 e2))
|
||||
(aY : forall n m : nat, addE n m # pY (val n) (val m) (vY n) (vY m) = vY (n + m))
|
||||
(x : ExpP)
|
||||
{struct x}
|
||||
: Y x
|
||||
:=
|
||||
(match x return _ -> Y x with
|
||||
| val n => fun _ => vY n
|
||||
| plus e1 e2 => fun _ => pY e1 e2 (ExpP_ind Y vY pY aY e1) (ExpP_ind Y vY pY aY e2)
|
||||
end) aY.
|
||||
|
||||
Axiom ExpP_ind_beta_addE : forall
|
||||
(Y : ExpP -> Type)
|
||||
(vY : forall n : nat, Y(val n))
|
||||
(pY : forall e1 e2 : ExpP, Y e1 -> Y e2 -> Y (plus e1 e2))
|
||||
(aY : forall n m : nat, addE n m # pY (val n) (val m) (vY n) (vY m) = vY (n + m))
|
||||
(n m : nat)
|
||||
, apD (ExpP_ind Y vY pY aY) (addE n m) = aY n m.
|
||||
|
||||
End plus.
|
||||
|
||||
(*
|
||||
Evaluates the expression, truncation is needed for images of the path.
|
||||
*)
|
||||
Definition evalExp : forall (e : ExpP), exists n : nat,
|
||||
Trunc (trunc_S minus_two) (e = val n).
|
||||
Proof.
|
||||
Proof.
|
||||
simple refine (ExpP_ind _ _ _ _); cbn.
|
||||
- intros.
|
||||
exists n.
|
||||
apply tr.
|
||||
reflexivity.
|
||||
- intros e1 e2 (v1, tp1) (v2, tp2).
|
||||
exists (v1 + v2).
|
||||
(* alternative option:
|
||||
simple refine (_ @ addE v1 v2).
|
||||
simple refine (_ @ ap (plus (val v1)) p2).
|
||||
apply (ap (fun x => plus x e2) p1).
|
||||
*)
|
||||
simple refine (Trunc_ind _ _ tp1).
|
||||
intro p1.
|
||||
simple refine (Trunc_ind _ _ tp2).
|
||||
intro p2.
|
||||
cbn.
|
||||
apply tr.
|
||||
apply (
|
||||
ap (plus e1) p2
|
||||
@ ap (fun x => plus x (val v2)) p1
|
||||
@ addE v1 v2).
|
||||
- intros.
|
||||
simple refine (path_sigma _ _ _ _ _).
|
||||
* cbn.
|
||||
simple refine
|
||||
(ap pr1 (@transport_sigma ExpP _ _ _ _ (addE n m) (n + m; tr (1 @ addE n m))) @ _).
|
||||
simple refine
|
||||
(transport_const (addE n m) _ @ _).
|
||||
reflexivity.
|
||||
* enough
|
||||
(forall (e1 e2 : ExpP) (x1 x2 : Trunc (trunc_S minus_two) (e1 = e2)),
|
||||
x1 = x2).
|
||||
apply X.
|
||||
intros.
|
||||
enough (IsHProp (Trunc -1 (e1 = e2))).
|
||||
apply X.
|
||||
apply istrunc_truncation.
|
||||
Defined.
|
||||
|
||||
(*
|
||||
Value of an expression
|
||||
*)
|
||||
Definition value (e : ExpP) := pr1 (evalExp e).
|
||||
|
||||
(*
|
||||
For tests, sum from 0 to n
|
||||
*)
|
||||
Fixpoint gauss (n : nat) :=
|
||||
match n with
|
||||
| 0 => val 0
|
||||
| S n => plus (val (S n)) (gauss n)
|
||||
end.
|
||||
|
||||
(*
|
||||
Denotational semantics of expressions as natural numbers
|
||||
*)
|
||||
Definition denotationalN : ExpP -> nat.
|
||||
Proof.
|
||||
simple refine (ExpP_ind _ _ _ _); cbn.
|
||||
- apply idmap.
|
||||
- intros e1 e2 n m.
|
||||
apply (n + m).
|
||||
- intros.
|
||||
apply transport_const.
|
||||
Defined.
|
||||
|
||||
(*
|
||||
Denotational semantics of expressions as loops on circle
|
||||
*)
|
||||
Definition denotationalS1 : ExpP -> base = base.
|
||||
Proof.
|
||||
simple refine (ExpP_ind _ _ _ _); cbn.
|
||||
- induction 1.
|
||||
* reflexivity.
|
||||
* apply (loop @ IHn).
|
||||
- intros e1 e2 p1 p2.
|
||||
apply (p1 @ p2).
|
||||
- intros n m.
|
||||
simple refine (transport_paths_FlFr _ _ @ _).
|
||||
hott_simpl.
|
||||
cbn.
|
||||
induction n ; induction m ; cbn.
|
||||
* reflexivity.
|
||||
* apply concat_1p.
|
||||
* etransitivity.
|
||||
apply concat_p1.
|
||||
cbn in IHn.
|
||||
simple refine (ap (fun p => loop @ p) _).
|
||||
etransitivity.
|
||||
Focus 2.
|
||||
apply IHn.
|
||||
|
||||
symmetry.
|
||||
apply concat_p1.
|
||||
* etransitivity.
|
||||
apply concat_pp_p.
|
||||
simple refine (ap (fun p => loop @ p) _).
|
||||
induction n.
|
||||
apply concat_1p.
|
||||
cbn in *.
|
||||
apply IHn.
|
||||
Defined.
|
||||
|
||||
Definition power {A : Type} {x : A} (p : x = x) (n : nat) : x = x.
|
||||
Proof.
|
||||
induction n.
|
||||
- reflexivity.
|
||||
- apply (p @ IHn).
|
||||
Defined.
|
||||
|
||||
Lemma power_plus : forall (A : Type) (x : A) (p : x = x) n m,
|
||||
power p (n + m) = (power p n) @ (power p m).
|
||||
Proof.
|
||||
induction n; simpl.
|
||||
- induction m; cbn; hott_simpl.
|
||||
- induction m; simpl.
|
||||
* rewrite <- nat_plus_n_O.
|
||||
hott_simpl.
|
||||
* rewrite IHn.
|
||||
hott_simpl.
|
||||
Defined.
|
||||
|
||||
Theorem sem : forall (e : ExpP),
|
||||
Trunc (trunc_S minus_two) (denotationalS1 e = power loop (denotationalN e)).
|
||||
Proof.
|
||||
simple refine (ExpP_ind _ _ _ _); simpl.
|
||||
- intros.
|
||||
apply tr.
|
||||
reflexivity.
|
||||
- intros e1 e2 tp1 tp2.
|
||||
simple refine (Trunc_ind _ _ tp1).
|
||||
intro p1.
|
||||
simple refine (Trunc_ind _ _ tp2).
|
||||
intro p2.
|
||||
simpl.
|
||||
apply tr.
|
||||
assert
|
||||
(power loop (denotationalN (plus e1 e2)) =
|
||||
power loop (denotationalN e1 + denotationalN e2)).
|
||||
{ reflexivity. }
|
||||
rewrite X.
|
||||
cbn.
|
||||
rewrite p1; rewrite p2.
|
||||
rewrite power_plus.
|
||||
reflexivity.
|
||||
- intros.
|
||||
enough
|
||||
(forall (e1 e2 : base = base) (x1 x2 : Trunc (trunc_S minus_two) (e1 = e2)),
|
||||
x1 = x2).
|
||||
apply X.
|
||||
|
||||
intros.
|
||||
enough (IsHProp (Trunc -1 (e1 = e2))).
|
||||
apply X.
|
||||
|
||||
apply istrunc_truncation.
|
||||
Defined.
|
Loading…
Reference in New Issue