diff --git a/sandbox/rat.lp b/sandbox/rat.lp index 6788872df8ba26adfee740175ac58f79600c4bc4..d6124fed35ffd9fde742294cd1ffeaa756865875 100644 --- a/sandbox/rat.lp +++ b/sandbox/rat.lp @@ -43,18 +43,59 @@ proof apply N.prod_comm a (fst b) qed +symbol trans {T} (x y z: Term T): + Term (x = y) ⇒ Term (y = z) ⇒ Term (x = z) + // theorem one_neutral (a: Term N.nat) (b: Term N.nznat): // Term (rateq (times (a / b) (1 / onz)) (1 / onz)) // proof // qed + +// NOTE: we use this rewriting rule because in the proof below, calling simpl +// causes protected [opair] to appear, and we cannot use refl since it requires +// the user to input the protected opair, which is forbidden. +// Perhaps using [hints] could help, using [refl Nat _] and the unification +// engine would instantiate _ accordingly, but it is not likely since it is +// based on non linearity, and hints are linear. +// We rather reduce the proof to the trivial proof +rule &x = &x → true +theorem right_cancel (a: Term N.Nat) (b: Term N.Nznat): + Term (rateq (times (a / b) ((fst b) / onz)) (a / onz)) +proof + assume a b + // We execute simplifications one by one because [simpl] unfolds too much + // reducing the beta redex [(λx, fst x) onz] + refine + trans + (N.times (N.times a (fst b)) ((λx, fst x) onz)) + (N.times (N.times a (fst b)) (fst onz)) + (N.times ((λx, fst x) (N.nznat (N.times (fst b) (fst onz)) (N.prod_not_zero (fst b) (fst onz) (snd b) (snd onz)))) a) + _ _ + simpl + refine λx, x + + // reducing beta redex [(λx, fst x) ...] + refine trans + (N.times (N.times a (fst b)) (fst onz)) + (N.times (fst (N.nznat (N.times (fst b) (fst onz)) (N.prod_not_zero (fst b) (fst onz) (snd b) (snd onz)))) a) + (N.times ((λx, fst x) (N.nznat (N.times (fst b) (fst onz)) (N.prod_not_zero (fst b) (fst onz) (snd b) (snd onz)))) a) + _ _ + focus 1 + refine λx, x + simpl + + refine N.prod_comm a (fst b) +qed + type Term (N.Nznat ⊑ N.Nat) type λ(b: Term N.Nznat) (pr: Term (N.Nznat ⊑ N.Nat)), ↑ N.Nat pr b -theorem right_cancellation (a: Term N.Nat) (b: Term N.Nznat) - (pr: Term (N.Nznat ⊑ N.Nat)): - Term (rateq (times (a / b) ((↑ N.Nat pr b) / onz)) (a / onz)) -proof -qed +//theorem cright_cancellation (a: Term N.Nat) (b: Term N.Nznat) +// (pr: Term (N.Nznat ⊑ N.Nat)): +// Term (rateq (times (a / b) ((↑ N.Nat pr b) / onz)) (a / onz)) +//proof +// +//qed // Should generate a TCC to provide [pr] // theorem right_cancel (a b: Term N.Nat) ()