Last active
July 18, 2018 13:48
-
-
Save prozacchiwawa/0a72c9495161b2111ee2e6ba2af94db2 to your computer and use it in GitHub Desktop.
ProofOfBin2NatIsReflexiveWithNat2Bin.idr
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| {-- | |
| Learning proof in idris. | |
| My first complete proof. | |
| Bin is a data type that uniquely represents Nat numbers in binary. It contains a representation | |
| only for a BNil element and "N zeros followed by a 1", which means that each Nat corresponds to | |
| precisely one Bin. | |
| The corresponence between nat2Bin and bin2Nat is proven so that bins can interoperate with nats. | |
| Comments welcome if anyone runs across this. If I do it over, I'd plan the proof a bit better | |
| now that I kind of know what I'm looking for. Some of the subgoals are ugly and probably | |
| unnecessary. | |
| --} | |
| %default total | |
| -- Thanks: https://stackoverflow.com/questions/46507712/how-can-i-have-idris-automatically-prove-that-two-values-are-not-equal | |
| fromFalse : (d : Dec p) -> {auto isFalse : decAsBool d = False} -> Not p | |
| fromFalse (Yes _) {isFalse = Refl} impossible | |
| fromFalse (No contra) = contra | |
| data NotEq : a -> a -> Type where | |
| MkNotEq : {a : t} -> {b : t} -> Not (a = b) -> NotEq a b | |
| %hint | |
| notEq : DecEq t => {a : t} -> {b : t} -> {auto isFalse : decAsBool (decEq a b) = False} -> NotEq a b | |
| notEq = MkNotEq (fromFalse (decEq _ _)) | |
| data Bin = O Nat Bin | BNil | |
| -- Thanks: https://www.reddit.com/r/Idris/comments/8yv5fn/using_deceq_in_proofs_extracting_and_applying_the/e2e8a6l/?context=3 | |
| O_injective : (O a v = O b w) -> (a = b, v = w) | |
| O_injective Refl = (Refl, Refl) | |
| total bnilNotO : {a : Nat} -> {b : Bin} -> (BNil = O a v) -> Void | |
| bnilNotO Refl Refl impossible | |
| total notOBNil : {a : Nat} -> {b : Bin} -> (O a v = BNil) -> Void | |
| notOBNil Refl Refl impossible | |
| total aNEBMeansNotEqual : (a : Nat) -> (b : Nat) -> (v : Bin) -> Dec (a = b) -> Dec (O a v = O b v) | |
| aNEBMeansNotEqual a b v (Yes prf) = rewrite prf in Yes Refl | |
| aNEBMeansNotEqual a b v (No contra) = | |
| No $ \prf => | |
| let (ojAB, _) = O_injective prf in | |
| contra ojAB | |
| total vNEWMeansNotEqual : (v : Bin) -> (w : Bin) -> Dec (v = w) -> Dec (O Z v = O Z w) | |
| vNEWMeansNotEqual v w (Yes prf) = rewrite prf in Yes Refl | |
| vNEWMeansNotEqual v w (No contra) = | |
| No $ \prf => | |
| let (_, ojVW) = O_injective prf in | |
| contra ojVW | |
| avNEBWMeansNotEqual : (a : Nat) -> (v : Bin) -> (b : Nat) -> (w : Bin) -> Dec (a = b) -> Dec (v = w) -> Dec (O a v = O b w) | |
| avNEBWMeansNotEqual a v b w (Yes prfAB) (Yes prfVW) = | |
| rewrite prfAB in | |
| rewrite prfVW in | |
| Yes Refl | |
| avNEBWMeansNotEqual a v b w (Yes prfAB) (No contraVW) = | |
| No $ \prf => | |
| let (_, ojVW) = O_injective prf in contraVW ojVW | |
| avNEBWMeansNotEqual a v b w (No contraAB) _ = | |
| No $ \prf => | |
| let (ojAV, _) = O_injective prf in contraAB ojAV | |
| eq0BNil : (O 0 BNil = O 0 BNil) | |
| eq0BNil = Refl | |
| doDecEqInner : (x1 : Bin) -> (x2 : Bin) -> Dec (x1 = x2) | |
| doDecEqInner BNil BNil = Yes Refl | |
| doDecEqInner BNil (O b w ) = | |
| No (bnilNotO {a=b} {b=w}) | |
| doDecEqInner (O a v ) BNil = | |
| No (notOBNil {a=a} {b=v}) | |
| doDecEqInner (O a v ) (O b w ) = | |
| avNEBWMeansNotEqual a v b w (decEq a b) (doDecEqInner v w) | |
| DecEq Bin where | |
| decEq = doDecEqInner | |
| binIsZero : Bin -> Bool | |
| binIsZero BNil = True | |
| binIsZero (O _ _) = False | |
| oneMore : Bin -> Bin | |
| oneMore BNil = BNil | |
| oneMore (O a x) = O (S a) x | |
| oneMoreZeroIsZero : oneMore BNil = BNil | |
| oneMoreZeroIsZero = Refl | |
| flipFromLeft : Bin -> Bin | |
| flipFromLeft BNil = O Z BNil | |
| flipFromLeft (O (S a) x) = O Z (O a x) | |
| flipFromLeft (O Z x) = assert_total (oneMore (flipFromLeft x)) | |
| binInc : Bin -> Bin | |
| binInc BNil = O Z BNil | |
| binInc (O Z BNil) = O (S Z) BNil | |
| binInc (O a v) = flipFromLeft (O a v) | |
| binDec : Bin -> Bin | |
| binDec BNil = BNil | |
| binDec (O Z BNil) = BNil | |
| binDec (O Z (O a b)) = (O (S a) b) | |
| {- | |
| 0001 -- -> 1110 | |
| -} | |
| binDec (O (S a) b) = | |
| assert_total (O Z (binDec (O a b))) | |
| nat2Bin : Nat -> Bin | |
| nat2Bin Z = BNil | |
| nat2Bin (S a) = binInc (nat2Bin a) | |
| nat2BinZIsBNil : nat2Bin Z = BNil | |
| nat2BinZIsBNil = Refl | |
| bin2Nat : Bin -> Nat | |
| bin2Nat BNil = Z | |
| bin2Nat (O Z v) = | |
| let m1 = assert_total (bin2Nat v) in | |
| let m2 = plus m1 m1 in | |
| S m2 | |
| bin2Nat (O (S a) v) = | |
| let m1 = assert_total (bin2Nat (O a v)) in | |
| plus m1 m1 | |
| bin2NatBNilIsZ : bin2Nat BNil = Z | |
| bin2NatBNilIsZ = Refl | |
| binAdd : Bin -> Bin -> Bin | |
| binAdd a b = nat2Bin (plus (bin2Nat a) (bin2Nat b)) | |
| testPlusA0 : (n : Nat) -> n = plus n 0 | |
| testPlusA0 Z = Refl | |
| testPlusA0 (S k) = | |
| let rec = testPlusA0 {n=k} in | |
| rewrite rec in Refl | |
| plusS1Eq2 : (n : Nat) -> plus n (S Z) = S n | |
| plusS1Eq2 Z = Refl | |
| plusS1Eq2 (S a) = | |
| let rec = plusS1Eq2 {n=a} in | |
| rewrite rec in Refl | |
| add2NEqNP2 : (n : Nat) -> (a : Nat) -> S (plus n a) = plus n (S a) | |
| add2NEqNP2 Z Z = Refl | |
| add2NEqNP2 Z (S a) = Refl | |
| add2NEqNP2 n Z = | |
| rewrite sym (testPlusA0 n) in | |
| rewrite (plusS1Eq2 n) in Refl | |
| add2NEqNP2 n (S a) = | |
| rewrite assert_total (add2NEqNP2 n (S a)) in Refl | |
| moveSInPlus2 : (a : Nat) -> S (plus a a) = plus a (S a) | |
| moveSInPlus2 Z = Refl | |
| moveSInPlus2 a1 = | |
| rewrite sym (add2NEqNP2 a1 a1) in Refl | |
| moveSInPlus3 : (a : Nat) -> S (plus a a) = plus (S a) a | |
| moveSInPlus3 Z = Refl | |
| moveSInPlus3 a1 = Refl | |
| moveSInPlus4 : (a : Nat) -> plus (S a) a = S (plus a a) | |
| moveSInPlus4 Z = Refl | |
| moveSInPlus4 a1 = Refl | |
| oneMoreIsTwiceAsMuch : (v : Bin) -> (plus (plus (bin2Nat v) (bin2Nat v)) (plus (bin2Nat v) (bin2Nat v))) = (bin2Nat (oneMore (oneMore v))) | |
| oneMoreIsTwiceAsMuch BNil = Refl | |
| oneMoreIsTwiceAsMuch (O Z v) = Refl | |
| oneMoreIsTwiceAsMuch (O (S a) v) = Refl | |
| oneMoreXIs2X : (b : Bin) -> bin2Nat (oneMore b) = plus (bin2Nat b) (bin2Nat b) | |
| oneMoreXIs2X BNil = Refl | |
| oneMoreXIs2X (O n a) = Refl | |
| plusAZ : (a : Nat) -> (a = plus a Z) | |
| plusAZ Z = Refl | |
| plusAZ (S a) = rewrite plusAZ a in Refl | |
| plusZA : (a : Nat) -> (a = plus Z a) | |
| plusZA Z = Refl | |
| plusZA (S a1) = Refl | |
| azPlus : (a : Nat) -> (plus a Z = a) | |
| azPlus Z = Refl | |
| azPlus (S a1) = rewrite azPlus {a=a1} in Refl | |
| zaPlus : (a : Nat) -> (plus Z a = a) | |
| zaPlus Z = Refl | |
| zaPlus (S a1) = Refl | |
| plus00B0 : Z = plus Z Z | |
| plus00B0 = Refl | |
| saEqSb : (a : Nat) -> (b : Nat) -> Dec (S a = S b) -> Dec (a = b) | |
| saEqSb Z Z (Yes prf) = Yes Refl | |
| saEqSb a Z (Yes prf) = | |
| case decEq a Z of | |
| Yes prf1 => | |
| rewrite prf1 in Yes Refl | |
| No contra => No contra | |
| saEqSb a (S b) (Yes prf) = | |
| case decEq a (S b) of | |
| Yes prf1 => rewrite prf1 in Yes Refl | |
| No contra => No contra | |
| saEqSb a b (No contra) = | |
| case decEq a b of | |
| Yes prf1 => rewrite prf1 in Yes Refl | |
| No contra => No contra | |
| ssaNe1 : {a : Nat} -> (S (S a) = 1) -> Void | |
| ssaNe1 Refl Refl impossible | |
| ssbNe1 : {b : Nat} -> (1 = S (S b)) -> Void | |
| ssbNe1 Refl Refl impossible | |
| sNotZ : {a : Nat} -> (S a = 0) -> Void | |
| sNotZ Refl Refl impossible | |
| bEq0MeansSbEq1 : (b : Nat) -> Dec (0 = b) -> Dec (1 = S b) | |
| bEq0MeansSbEq1 Z _ = Yes Refl | |
| bEq0MeansSbEq1 (S b) _ = No $ \prfx => ssbNe1 prfx | |
| saEqSb2 : (a : Nat) -> (b : Nat) -> (rw : Dec (a = b)) -> Dec (S a = S b) | |
| saEqSb2 Z Z (Yes prf) = Yes Refl | |
| saEqSb2 a Z (Yes prf) = | |
| case decEq a Z of | |
| Yes prf1 => rewrite prf1 in Yes Refl | |
| No contra => No $ \prfx => contra prf | |
| saEqSb2 (S a) Z (No contra) = | |
| case decEq (S a) Z of | |
| Yes prf1 => rewrite prf1 in Yes Refl | |
| No contra1 => No ssaNe1 | |
| saEqSb2 a (S b) (Yes prf) = | |
| case decEq a (S b) of | |
| Yes prf1 => rewrite prf1 in Yes Refl | |
| No contra => No $ \prfx => contra prf | |
| saEqSb2 Z (S b) (No contra) = No ssbNe1 | |
| saEqSb2 a b (No contra) = | |
| saEqSb (S a) (S b) (decEq (S (S a)) (S (S b))) | |
| saEqSb3 : (a : Nat) -> (b : Nat) -> Dec (plus a 0 = plus b 0) -> Dec (a = b) | |
| saEqSb3 a b prf = | |
| rewrite plusAZ a in | |
| rewrite plusAZ b in | |
| prf | |
| plusA0EqPlusB0 : (a : Nat) -> (b : Nat) -> (rw : Dec (plus a 1 = plus b 1)) -> Dec (plus a 0 = plus b 0) | |
| plusA0EqPlusB0 Z Z (Yes prf) = Yes Refl | |
| plusA0EqPlusB0 a Z (Yes prf) = | |
| rewrite azPlus a in | |
| case decEq a Z of | |
| Yes prf1 => Yes prf1 | |
| No contra => No contra | |
| plusA0EqPlusB0 (S a1) (S b1) (Yes prf) = | |
| rewrite add2NEqNP2 a1 0 in | |
| rewrite add2NEqNP2 b1 0 in | |
| rewrite plusS1Eq2 a1 in | |
| rewrite plusS1Eq2 b1 in | |
| saEqSb2 a1 b1 (decEq a1 b1) | |
| plusA0EqPlusB0 (S a1) (S b1) (No contra) = | |
| rewrite add2NEqNP2 a1 0 in | |
| rewrite add2NEqNP2 b1 0 in | |
| rewrite plusS1Eq2 a1 in | |
| rewrite plusS1Eq2 b1 in | |
| saEqSb2 a1 b1 (decEq a1 b1) | |
| plusA1EqPlusB1 : (a : Nat) -> (b : Nat) -> Dec (a = b) -> Dec (plus a 1 = plus b 1) | |
| plusA1EqPlusB1 a b (Yes prf) = | |
| rewrite prf in Yes Refl | |
| plusA1EqPlusB1 a b (No contra) = | |
| let re = plusA0EqPlusB0 a b (decEq (plus a 1) (plus b 1)) in | |
| rewrite plusS1Eq2 a in | |
| rewrite plusS1Eq2 b in | |
| saEqSb2 a b (No contra) | |
| removeOneS : (a : Nat) -> (b : Nat) -> Dec (a = b) -> Dec (S a = S b) | |
| removeOneS a b (Yes prf) = | |
| rewrite prf in Yes Refl | |
| removeOneS a b (No contra) = | |
| rewrite plusAZ a in | |
| rewrite plusAZ b in | |
| saEqSb2 (plus a 0) (plus b 0) (decEq (plus a 0) (plus b 0)) | |
| twoTimesAIsZeroIfAIs2 : (a : Nat) -> Dec (plus a a = 0) -> Dec (a = 0) | |
| twoTimesAIsZeroIfAIs2 a prf = | |
| saEqSb3 a 0 (decEq (plus a 0) 0) | |
| twoTimesAIsZeroIfAIs : (a : Nat) -> Dec (a = 0) -> Dec (plus a a = 0) | |
| twoTimesAIsZeroIfAIs a (Yes prf) = rewrite prf in Yes Refl | |
| twoTimesAIsZeroIfAIs Z _ = Yes Refl | |
| twoTimesAIsZeroIfAIs (S a) (No contra) = | |
| rewrite sym (add2NEqNP2 a a) in | |
| No $ \prf => | |
| sNotZ {a=S (plus a a)} prf | |
| fourIsNotZero : (S (S (S (S Z))) = 0) -> Void | |
| fourIsNotZero Refl impossible | |
| fourIsNotTwo : (S (S (S (S Z))) = S (S Z)) -> Void | |
| fourIsNotTwo Refl impossible | |
| sixIsNotZero : (S (S (S (S (S (S Z))))) = plus 0 0) -> Void | |
| sixIsNotZero Refl impossible | |
| sixIsNotTwo : (S (S (S (S (S (S Z))))) = plus 1 1) -> Void | |
| sixIsNotTwo Refl impossible | |
| sixIsNotFour : (S (S (S (S (S (S Z))))) = plus 2 2) -> Void | |
| sixIsNotFour Refl impossible | |
| fourIsNotAPlus6 : {a : Nat} -> (S (S (S (S Z))) = S (S (S (S (S (S (plus a a))))))) -> Void | |
| fourIsNotAPlus6 Refl impossible | |
| eightIsNotZero : (S (S (S (S (S (S (S (S Z))))))) = 0) -> Void | |
| eightIsNotZero Refl impossible | |
| eightIsNotTwo : (S (S (S (S (S (S (S (S Z))))))) = (S (S Z))) -> Void | |
| eightIsNotTwo Refl impossible | |
| eightIsNotFour : (S (S (S (S (S (S (S (S Z))))))) = (S (S (S (S Z))))) -> Void | |
| eightIsNotFour Refl impossible | |
| eightIsNotSix : (S (S (S (S (S (S (S (S Z))))))) = (S (S (S (S (S (S Z))))))) -> Void | |
| eightIsNotSix Refl impossible | |
| sixIsNotAPlus8 : {a : Nat} -> (S (S (S (S (S (S Z))))) = S (S (S (S (S (S (S (S (plus a a))))))))) -> Void | |
| sixIsNotAPlus8 Refl impossible | |
| eightIsNotAPlus10 : {a : Nat} -> (S (S (S (S (S (S (S (S Z))))))) = S (S (S (S (S (S (S (S (S (S (plus a a))))))))))) -> Void | |
| eightIsNotAPlus10 Refl impossible | |
| tenIsNotZero : (S (S (S (S (S (S (S (S (S (S Z))))))))) = plus 0 0) -> Void | |
| tenIsNotZero Refl impossible | |
| tenIsNotTwo : (S (S (S (S (S (S (S (S (S (S Z))))))))) = plus (S Z) (S Z)) -> Void | |
| tenIsNotTwo Refl impossible | |
| tenIsNotFour : (S (S (S (S (S (S (S (S (S (S Z))))))))) = plus (S (S Z)) (S (S Z))) -> Void | |
| tenIsNotFour Refl impossible | |
| tenIsNotSix : (S (S (S (S (S (S (S (S (S (S Z))))))))) = plus (S (S (S Z))) (S (S (S Z)))) -> Void | |
| tenIsNotSix Refl impossible | |
| tenIsNotEight : (S (S (S (S (S (S (S (S (S (S Z))))))))) = plus (S (S (S (S Z)))) (S (S (S (S Z))))) -> Void | |
| tenIsNotEight Refl impossible | |
| tenIsNotAPlus12 : {a : Nat} -> (S (S (S (S (S (S (S (S (S (S Z))))))))) = S (S (S (S (S (S (S (S (S (S (S (S (plus a a))))))))))))) -> Void | |
| tenIsNotAPlus12 Refl impossible | |
| twoIsNotAPlus3 : {a : Nat} -> (S (S Z) = S (S (S a))) -> Void | |
| twoIsNotAPlus3 Refl impossible | |
| fourPlusAIsNot0 : {a : Nat} -> (S (S (S (S a))) = 0) -> Void | |
| fourPlusAIsNot0 Refl impossible | |
| fourPlusAIsNot2 : {a : Nat} -> (S (S (S (S a))) = 2) -> Void | |
| fourPlusAIsNot2 Refl impossible | |
| a2Pa4 : (a : Nat) -> Dec (2 = a) -> Dec (4 = plus a a) | |
| a2Pa4 (S (S Z)) _ = Yes Refl | |
| a2Pa4 a (Yes r) = | |
| rewrite r in | |
| rewrite sym r in Yes Refl | |
| a2Pa4 Z (No contra) = No fourIsNotZero | |
| a2Pa4 (S Z) _ = No fourIsNotTwo | |
| a2Pa4 (S (S (S a))) (No contra) = | |
| rewrite sym (add2NEqNP2 a (S (S a))) in | |
| rewrite sym (add2NEqNP2 a (S a)) in | |
| rewrite sym (add2NEqNP2 a a) in | |
| No fourIsNotAPlus6 | |
| plusZZPlus4N : {n : Nat} -> (S (S (S (S (plus n n)))) = plus 0 0) -> Void | |
| plusZZPlus4N Refl impossible | |
| plus2NEq0 : {n : Nat} -> (S (S n) = 0) -> Void | |
| plus2NEq0 Refl impossible | |
| plus2NEq1 : {n : Nat} -> (S (S n) = 1) -> Void | |
| plus2NEq1 Refl impossible | |
| plus4NNEqPlus2APlus2A : (n : Nat) -> (S (S (S (S (plus n n)))) = plus (S (S n)) (S (S n))) | |
| plus4NNEqPlus2APlus2A n = | |
| rewrite sym (add2NEqNP2 n (S n)) in | |
| rewrite sym (add2NEqNP2 n n) in | |
| Refl | |
| a4Pa2 : (n : Nat) -> (a : Nat) -> Dec (S (S (S (S (plus n n)))) = plus a a) -> Dec (S (S n) = a) | |
| a4Pa2 n Z prf = No plus2NEq0 | |
| a4Pa2 n (S Z) prf = No plus2NEq1 | |
| a4Pa2 Z (S (S Z)) p = Yes Refl | |
| a4Pa2 Z (S (S (S a))) p = No twoIsNotAPlus3 | |
| a4Pa2 n (S (S a)) p = decEq (S (S n)) (S (S a)) | |
| a3Pa6 : (a : Nat) -> Dec (3 = a) -> Dec (6 = plus a a) | |
| a3Pa6 (S (S (S Z))) _ = Yes Refl | |
| a3Pa6 a (Yes r) = | |
| rewrite r in | |
| rewrite sym r in Yes Refl | |
| a3Pa6 Z (No contra) = No sixIsNotZero | |
| a3Pa6 (S Z) _ = No sixIsNotTwo | |
| a3Pa6 (S (S Z)) _ = No sixIsNotFour | |
| a3Pa6 (S (S (S (S a)))) (No contra) = | |
| rewrite sym (add2NEqNP2 a (S (S (S a)))) in | |
| rewrite sym (add2NEqNP2 a (S (S a))) in | |
| rewrite sym (add2NEqNP2 a (S a)) in | |
| rewrite sym (add2NEqNP2 a a) in | |
| No sixIsNotAPlus8 | |
| a4Pa8 : (a : Nat) -> Dec (4 = a) -> Dec (8 = plus a a) | |
| a4Pa8 (S (S (S (S Z)))) _ = Yes Refl | |
| a4Pa8 a (Yes r) = | |
| rewrite r in | |
| rewrite sym r in Yes Refl | |
| a4Pa8 Z (No contra) = No eightIsNotZero | |
| a4Pa8 (S Z) _ = No eightIsNotTwo | |
| a4Pa8 (S (S Z)) _ = No eightIsNotFour | |
| a4Pa8 (S (S (S Z))) _ = No eightIsNotSix | |
| a4Pa8 (S (S (S (S (S a))))) (No contra) = | |
| rewrite sym (add2NEqNP2 a (S (S (S (S a))))) in | |
| rewrite sym (add2NEqNP2 a (S (S (S a)))) in | |
| rewrite sym (add2NEqNP2 a (S (S a))) in | |
| rewrite sym (add2NEqNP2 a (S a)) in | |
| rewrite sym (add2NEqNP2 a a) in | |
| No eightIsNotAPlus10 | |
| fourPlusNNEqPlusN2N2 : (n : Nat) -> (S (S (S (S (plus n n)))) = plus (S (S n)) (S (S n))) | |
| fourPlusNNEqPlusN2N2 n = | |
| rewrite sym (add2NEqNP2 n (S n)) in | |
| rewrite sym (add2NEqNP2 n n) in | |
| Refl | |
| threePlusAIsNot2 : {a : Nat} -> (S (S (S a)) = S (S Z)) -> Void | |
| threePlusAIsNot2 Refl impossible | |
| twoIsNotThreePlusA : {a : Nat} -> (S (S Z) = S (S (S a))) -> Void | |
| twoIsNotThreePlusA Refl impossible | |
| fivePlusAIsNotFour : {a : Nat} -> (S (S (S (S (S a)))) = S (S (S (S Z)))) -> Void | |
| fivePlusAIsNotFour Refl impossible | |
| ssNEqPlusAA : (n : Nat) -> (a : Nat) -> Dec (S (S n) = a) -> Dec (S (S (S (S (plus n n)))) = plus a a) | |
| ssNEqPlusAA Z a p = a2Pa4 a p | |
| ssNEqPlusAA (S Z) a p = a3Pa6 a p | |
| ssNEqPlusAA (S (S Z)) a p = a4Pa8 a p | |
| ssNEqPlusAA n a (Yes p) = | |
| rewrite sym p in | |
| rewrite fourPlusNNEqPlusN2N2 n in | |
| let ssres1 = saEqSb (S (S (S (S (plus n n))))) (S (S n)) in | |
| let ssres2 = saEqSb (S (S (S (plus n n)))) (S n) in | |
| Yes Refl | |
| ssNEqPlusAA n Z (No contra) = No fourPlusAIsNot0 | |
| ssNEqPlusAA n (S Z) (No contra) = No fourPlusAIsNot2 | |
| ssNEqPlusAA (S n) (S (S Z)) (No contra) = No fivePlusAIsNotFour | |
| ssNEqPlusAA n (S (S a)) (No contra) = | |
| rewrite fourPlusNNEqPlusN2N2 n in | |
| decEq (S (S (plus n (S (S n))))) (S (S (plus a (S (S a))))) | |
| canHalveAdds4 : (n : Nat) -> (a : Nat) -> (S (S n) = plus a a) -> ((S (S (S (S (plus n n))))) = plus (plus a a) (plus a a)) | |
| canHalveAdds4 n a prf = | |
| rewrite sym prf in | |
| rewrite sym (moveSInPlus2 (S n)) in | |
| rewrite sym (moveSInPlus2 n) in Refl | |
| fourSBackIn : (a : Nat) -> (S (S (S (S (plus (plus a a) (plus a a))))) = plus (plus (S a) (S a)) (plus (S a) (S a))) | |
| fourSBackIn Z = Refl | |
| fourSBackIn (S a) = | |
| rewrite sym (add2NEqNP2 a a) in | |
| rewrite sym (add2NEqNP2 a (S a)) in | |
| rewrite sym (add2NEqNP2 a a) in | |
| rewrite sym (add2NEqNP2 (plus a a) (S (plus a a))) in | |
| rewrite sym (add2NEqNP2 (plus a a) (plus a a)) in | |
| rewrite sym (add2NEqNP2 (plus a a) (S (S (S (plus a a))))) in | |
| rewrite sym (add2NEqNP2 (plus a a) (S (S (plus a a)))) in | |
| rewrite sym (add2NEqNP2 (plus a a) (S (plus a a))) in | |
| rewrite sym (add2NEqNP2 (plus a a) (plus a a)) in | |
| Refl | |
| ssPlusAAEqPlusSaSa : (a : Nat) -> (S (S (plus a a)) = plus (S a) (S a)) | |
| ssPlusAAEqPlusSaSa Z = Refl | |
| ssPlusAAEqPlusSaSa (S a) = | |
| rewrite moveSInPlus2 (S a) in | |
| Refl | |
| oneMoreFlipFromNatEqSb2NOAV : (a : Nat) -> (v : Bin) -> (S (S (plus (bin2Nat (O a v)) (bin2Nat (O a v)))) = bin2Nat (oneMore (flipFromLeft (O a v)))) | |
| oneMoreFlipFromNatEqSb2NOAV Z BNil = Refl | |
| oneMoreFlipFromNatEqSb2NOAV (S a) v = | |
| rewrite sym (add2NEqNP2 (plus (bin2Nat (O a v)) (bin2Nat (O a v))) (plus (bin2Nat (O a v)) (bin2Nat (O a v)))) in | |
| Refl | |
| oneMoreFlipFromNatEqSb2NOAV Z (O a1 v1) = | |
| rewrite sym (add2NEqNP2 (plus (bin2Nat (O a1 v1)) (bin2Nat (O a1 v1))) (plus (bin2Nat (O a1 v1)) (bin2Nat (O a1 v1)))) in | |
| rewrite oneMoreXIs2X (oneMore (flipFromLeft (O a1 v1))) in | |
| rewrite sym (oneMoreFlipFromNatEqSb2NOAV a1 v1) in | |
| rewrite sym (add2NEqNP2 (S (S (plus (bin2Nat (O a1 v1)) (bin2Nat (O a1 v1))))) (S (plus (bin2Nat (O a1 v1)) (bin2Nat (O a1 v1))))) in | |
| rewrite sym (add2NEqNP2 (S (S (plus (bin2Nat (O a1 v1)) (bin2Nat (O a1 v1))))) (plus (bin2Nat (O a1 v1)) (bin2Nat (O a1 v1)))) in | |
| ?oneMoreFlipFromNatEqSb2NOAVProof | |
| ssBin2NatOneMoreVEqPlus2XBin2NatFLipFromLeftV : (v : Bin) -> (S (S (bin2Nat (oneMore v))) = (plus (bin2Nat (flipFromLeft v)) (bin2Nat (flipFromLeft v)))) | |
| ssBin2NatOneMoreVEqPlus2XBin2NatFLipFromLeftV BNil = Refl | |
| ssBin2NatOneMoreVEqPlus2XBin2NatFLipFromLeftV (O Z BNil) = Refl | |
| ssBin2NatOneMoreVEqPlus2XBin2NatFLipFromLeftV (O (S a) v) = | |
| rewrite moveSInPlus2 (plus (bin2Nat (O a v)) (bin2Nat (O a v))) in | |
| Refl | |
| ssBin2NatOneMoreVEqPlus2XBin2NatFLipFromLeftV (O Z (O a v)) = | |
| rewrite sym (oneMoreFlipFromNatEqSb2NOAV a v) in | |
| rewrite sym (add2NEqNP2 (plus (bin2Nat (O a v)) (bin2Nat (O a v))) (plus (bin2Nat (O a v)) (bin2Nat (O a v)))) in | |
| rewrite sym (add2NEqNP2 (plus (bin2Nat (O a v)) (bin2Nat (O a v))) (S (plus (bin2Nat (O a v)) (bin2Nat (O a v))))) in | |
| rewrite sym (add2NEqNP2 (plus (bin2Nat (O a v)) (bin2Nat (O a v))) (plus (bin2Nat (O a v)) (bin2Nat (O a v)))) in | |
| Refl | |
| canHalveAdds4Start : (v : Bin) -> S (S (S (S (plus (bin2Nat (oneMore v)) (bin2Nat (oneMore v)))))) = plus (plus (bin2Nat (flipFromLeft v)) (bin2Nat (flipFromLeft v))) (plus (bin2Nat (flipFromLeft v)) (bin2Nat (flipFromLeft v))) | |
| canHalveAdds4Start v = | |
| canHalveAdds4 (bin2Nat (oneMore v)) (bin2Nat (flipFromLeft v)) (ssBin2NatOneMoreVEqPlus2XBin2NatFLipFromLeftV v) | |
| canHalveAdds8Start : (v : Bin) -> S (S (plus (bin2Nat v) (bin2Nat v))) = bin2Nat (oneMore (flipFromLeft v)) | |
| canHalveAdds8Start BNil = Refl | |
| canHalveAdds8Start (O a v) = | |
| rewrite oneMoreFlipFromNatEqSb2NOAV a v in | |
| Refl | |
| moveAllS1 : (x : Nat) -> S (S (S (S (plus (plus (plus x x) (plus x x)) (plus (plus x x) (plus x x)))))) = S (plus (plus (plus x x) (S (plus x x))) (S (plus (plus x x) (S (plus x x))))) | |
| moveAllS1 Z = Refl | |
| moveAllS1 (S a) = | |
| rewrite sym (add2NEqNP2 a a) in | |
| rewrite sym (add2NEqNP2 (S (plus a a)) (S (S (plus a a)))) in | |
| rewrite sym (add2NEqNP2 (S (plus a a)) (S (plus a a))) in | |
| rewrite sym (add2NEqNP2 (S (plus a a)) (plus a a)) in | |
| rewrite sym (add2NEqNP2 (plus a a) (S (S (plus a a)))) in | |
| rewrite sym (add2NEqNP2 (plus a a) (S (plus a a))) in | |
| rewrite sym (add2NEqNP2 (plus a a) (plus a a)) in | |
| rewrite sym (add2NEqNP2 (plus (plus a a) (plus a a)) (S (S (S (plus (plus a a) (plus a a)))))) in | |
| rewrite sym (add2NEqNP2 (plus (plus a a) (plus a a)) (S (S (plus (plus a a) (plus a a))))) in | |
| rewrite sym (add2NEqNP2 (plus (plus a a) (plus a a)) (S (plus (plus a a) (plus a a)))) in | |
| rewrite sym (add2NEqNP2 (plus (plus a a) (plus a a)) (plus (plus a a) (plus a a))) in | |
| rewrite sym (add2NEqNP2 (plus (plus a a) (plus a a)) (S (S (S (S (S (plus (plus a a) (plus a a)))))))) in | |
| rewrite sym (add2NEqNP2 (plus (plus a a) (plus a a)) (S (S (S (S (plus (plus a a) (plus a a))))))) in | |
| rewrite sym (add2NEqNP2 (plus (plus a a) (plus a a)) (S (S (S (plus (plus a a) (plus a a)))))) in | |
| rewrite sym (add2NEqNP2 (plus (plus a a) (plus a a)) (S (S (plus (plus a a) (plus a a))))) in | |
| rewrite sym (add2NEqNP2 (plus (plus a a) (plus a a)) (S (plus (plus a a) (plus a a)))) in | |
| rewrite sym (add2NEqNP2 (plus (plus a a) (plus a a)) (plus (plus a a) (plus a a))) in | |
| Refl | |
| moveAllS2 : (x : Nat) -> S (S (S (S (S (plus (plus (plus x x) (S (plus x x))) (S (plus (plus x x) (S (plus x x))))))))) = S (S (S (S (S (S (S (S (plus (plus (plus x x) (plus x x)) (plus (plus x x) (plus x x)))))))))) | |
| moveAllS2 Z = Refl | |
| moveAllS2 (S a) = | |
| rewrite sym (add2NEqNP2 a a) in | |
| rewrite sym (add2NEqNP2 (S (plus a a)) (S (S (plus a a)))) in | |
| rewrite sym (add2NEqNP2 (S (plus a a)) (S (plus a a))) in | |
| rewrite sym (add2NEqNP2 (S (plus a a)) (plus a a)) in | |
| rewrite sym (add2NEqNP2 (plus a a) (S (S (plus a a)))) in | |
| rewrite sym (add2NEqNP2 (plus a a) (S (plus a a))) in | |
| rewrite sym (add2NEqNP2 (plus a a) (plus a a)) in | |
| rewrite sym (add2NEqNP2 (plus (plus a a) (plus a a)) (S (S (S (plus (plus a a) (plus a a)))))) in | |
| rewrite sym (add2NEqNP2 (plus (plus a a) (plus a a)) (S (S (plus (plus a a) (plus a a))))) in | |
| rewrite sym (add2NEqNP2 (plus (plus a a) (plus a a)) (S (plus (plus a a) (plus a a)))) in | |
| rewrite sym (add2NEqNP2 (plus (plus a a) (plus a a)) (plus (plus a a) (plus a a))) in | |
| rewrite sym (add2NEqNP2 (plus (plus a a) (plus a a)) (S (S (S (S (S (plus (plus a a) (plus a a)))))))) in | |
| rewrite sym (add2NEqNP2 (plus (plus a a) (plus a a)) (S (S (S (S (plus (plus a a) (plus a a))))))) in | |
| rewrite sym (add2NEqNP2 (plus (plus a a) (plus a a)) (S (S (S (plus (plus a a) (plus a a)))))) in | |
| rewrite sym (add2NEqNP2 (plus (plus a a) (plus a a)) (S (S (plus (plus a a) (plus a a))))) in | |
| rewrite sym (add2NEqNP2 (plus (plus a a) (plus a a)) (S (plus (plus a a) (plus a a)))) in | |
| rewrite sym (add2NEqNP2 (plus (plus a a) (plus a a)) (plus (plus a a) (plus a a))) in | |
| Refl | |
| prove2XBin2NatFlipFromLeftVEqBin2NatOneMoreV : (v : Bin) -> S (S (S (S (plus (bin2Nat (oneMore v)) (bin2Nat (oneMore v)))))) = plus (plus (bin2Nat (flipFromLeft v)) (bin2Nat (flipFromLeft v))) (plus (bin2Nat (flipFromLeft v)) (bin2Nat (flipFromLeft v))) | |
| prove2XBin2NatFlipFromLeftVEqBin2NatOneMoreV BNil = Refl | |
| prove2XBin2NatFlipFromLeftVEqBin2NatOneMoreV (O Z BNil) = Refl | |
| prove2XBin2NatFlipFromLeftVEqBin2NatOneMoreV (O (S a) BNil) = | |
| rewrite moveAllS1 (bin2Nat (O a BNil)) in Refl | |
| prove2XBin2NatFlipFromLeftVEqBin2NatOneMoreV (O (S a) (O b w)) = | |
| rewrite moveAllS1 (bin2Nat (O a (O b w))) in Refl | |
| prove2XBin2NatFlipFromLeftVEqBin2NatOneMoreV (O Z (O a v)) = | |
| rewrite moveAllS2 (bin2Nat (O a v)) in | |
| rewrite sym (oneMoreFlipFromNatEqSb2NOAV a v) in | |
| rewrite sym (add2NEqNP2 (plus (bin2Nat (O a v)) (bin2Nat (O a v))) (S (plus (bin2Nat (O a v)) (bin2Nat (O a v))))) in | |
| rewrite sym (add2NEqNP2 (plus (bin2Nat (O a v)) (bin2Nat (O a v))) (plus (bin2Nat (O a v)) (bin2Nat (O a v)))) in | |
| rewrite sym (add2NEqNP2 (plus (plus (bin2Nat (O a v)) (bin2Nat (O a v))) (plus (bin2Nat (O a v)) (bin2Nat (O a v)))) (S (S (S (plus (plus (bin2Nat (O a v)) (bin2Nat (O a v))) (plus (bin2Nat (O a v)) (bin2Nat (O a v)))))))) in | |
| rewrite sym (add2NEqNP2 (plus (plus (bin2Nat (O a v)) (bin2Nat (O a v))) (plus (bin2Nat (O a v)) (bin2Nat (O a v)))) (S (S (plus (plus (bin2Nat (O a v)) (bin2Nat (O a v))) (plus (bin2Nat (O a v)) (bin2Nat (O a v))))))) in | |
| rewrite sym (add2NEqNP2 (plus (plus (bin2Nat (O a v)) (bin2Nat (O a v))) (plus (bin2Nat (O a v)) (bin2Nat (O a v)))) (S (plus (plus (bin2Nat (O a v)) (bin2Nat (O a v))) (plus (bin2Nat (O a v)) (bin2Nat (O a v)))))) in | |
| rewrite sym (add2NEqNP2 (plus (plus (bin2Nat (O a v)) (bin2Nat (O a v))) (plus (bin2Nat (O a v)) (bin2Nat (O a v)))) (plus (plus (bin2Nat (O a v)) (bin2Nat (O a v))) (plus (bin2Nat (O a v)) (bin2Nat (O a v))))) in | |
| Refl | |
| testBin2Nat : (b : Bin) -> S (bin2Nat b) = bin2Nat (binInc b) | |
| testBin2Nat BNil = Refl | |
| testBin2Nat (O Z BNil) = Refl | |
| testBin2Nat (O Z (O Z v)) = | |
| rewrite sym (add2NEqNP2 (plus (bin2Nat v) (bin2Nat v)) (plus (bin2Nat v) (bin2Nat v))) in | |
| rewrite oneMoreIsTwiceAsMuch v in | |
| rewrite oneMoreXIs2X (oneMore (flipFromLeft v)) in | |
| rewrite oneMoreXIs2X (oneMore v) in | |
| rewrite oneMoreXIs2X (flipFromLeft v) in | |
| rewrite canHalveAdds4Start v in Refl | |
| testBin2Nat (O Z (O (S a) v)) = | |
| rewrite (add2NEqNP2 (plus (bin2Nat (O a v)) (bin2Nat (O a v))) (plus (bin2Nat (O a v)) (bin2Nat (O a v)))) in Refl | |
| testBin2Nat (O (S a) BNil) = Refl | |
| testBin2Nat (O (S a) (O b v)) = Refl | |
| sAISBin2NatBinIncNat2BinA : (a : Nat) -> S a = bin2Nat (binInc (nat2Bin a)) | |
| sAISBin2NatBinIncNat2BinA Z = Refl | |
| sAISBin2NatBinIncNat2BinA (S a) = | |
| rewrite sym (testBin2Nat (binInc (nat2Bin a))) in | |
| rewrite sAISBin2NatBinIncNat2BinA a in | |
| Refl | |
| bin2NatIsReflexiveWithNat2Bin : (a : Nat) -> a = (bin2Nat (nat2Bin a)) | |
| bin2NatIsReflexiveWithNat2Bin Z = Refl | |
| bin2NatIsReflexiveWithNat2Bin (S a) = | |
| rewrite sAISBin2NatBinIncNat2BinA a in | |
| Refl | |
| main : IO () | |
| main = putStrLn "hi" | |
| ---------- Proofs ---------- | |
| Main.oneMoreFlipFromNatEqSb2NOAVProof = proof | |
| intros | |
| compute | |
| trivial | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment