From 733dfb4861a3fec3d28b1a86e274c7ec6473f871 Mon Sep 17 00:00:00 2001
From: gabrielhdt <gabrielhondet@gmail.com>
Date: Tue, 3 Mar 2020 10:37:27 +0100
Subject: [PATCH] excluded middle and cast transitivity

---
 prelude/cert_f/logic.lp | 18 ++++++++++++++++--
 1 file changed, 16 insertions(+), 2 deletions(-)

diff --git a/prelude/cert_f/logic.lp b/prelude/cert_f/logic.lp
index 95d431a..497c2d9 100644
--- a/prelude/cert_f/logic.lp
+++ b/prelude/cert_f/logic.lp
@@ -1,6 +1,7 @@
 require open encodings.cert_f
 adlib.cert_f.booleans
 require adlib.cert_f.induction as I
+require adlib.cert_f.subtype as S
 
 //
 // Booleans
@@ -11,12 +12,17 @@ require adlib.cert_f.induction as I
 //
 symbol eq {T: Term uType}: Term T ⇒ Term T ⇒ Term uProp
 
+// NOTE not in the prelude
+constant symbol cast_trans (A B C: Term uType) (prab: Term (A ⊑ B)) (prbc: Term (B ⊑ C))
+  (x: Term A):
+  Term (eq (↑ {B} C prbc (↑ {A} B prab x))
+  (↑ {A} C (S.trans A B C prab prbc) x))
+
 //
 // Notequal
 //
 definition neq {T: Term uType} (x y: Term T) ≔ bnot (eq x y)
 set infix left 6 "/=" ≔ neq
-set declared "≠"
 set infix left 6 "≠" ≔ neq
 
 //
@@ -28,12 +34,20 @@ symbol if {T: Term uType} : Term uProp ⇒ Term T ⇒ Term T ⇒ Term T
 //
 // boolean_props
 // Slightly modified from the prelude
+// FIXME explicitness required
 constant symbol bool_exclusive: Term (@neq bool false true)
 constant symbol bool_inclusive A: Term ((@eq bool A false) ∨ (@eq bool A true))
 
 theorem excluded_middle (A: Term bool): Term (A ∨ ¬ A)
 proof
-admit
+  refine I.disjunction
+    (λA, A ∨ (¬ A))
+    ?Ct ?Cf
+  assume F1 F2
+  refine F2
+  assume F1 F2
+  refine F1 F2
+qed
 
 //
 // xor_def
-- 
GitLab