Mercurial > hg > Members > kono > Proof > category
diff negnat.agda @ 451:3ee32e4df4c7
add negation example
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 28 Feb 2017 12:38:23 +0900 |
parents | |
children | 7ed0045e4adf |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/negnat.agda Tue Feb 28 12:38:23 2017 +0900 @@ -0,0 +1,169 @@ + + +module negnat where + + +open import Data.Nat +open import Relation.Nullary +open import Data.Empty +open import Data.Unit +open import Data.Fin renaming ( suc to fsuc ; zero to fzero ; _+_ to _++_ ) +open import Relation.Binary.Core +open import Relation.Binary.PropositionalEquality + + +-- http://stackoverflow.com/questions/22580842/non-trivial-negation-in-agda + + +ℕ-elim : ∀ {p} (P : ℕ → Set p) + (s : ∀ {n} → P n → P (suc n)) + (z : P 0) → ∀ n → P n +ℕ-elim P s z zero = z +ℕ-elim P s z (suc n) = s (ℕ-elim P s z n) + +-- peano : ∀ n → suc n ≡ zero → ⊥ + +Nope : (m n : ℕ) → Set +Nope (suc _) zero = ⊥ +Nope _ _ = ⊤ + +nope : ∀ m n → m ≡ n → Nope m n +nope zero ._ refl = _ +nope (suc m) ._ refl = _ + +peano : ∀ n → suc n ≡ zero → ⊥ +peano _ p = nope _ _ p + + +J : ∀ {a p} {A : Set a} (P : ∀ (x : A) y → x ≡ y → Set p) + (f : ∀ x → P x x refl) → ∀ x y → (p : x ≡ y) → P x y p +J P f x .x refl = f x + +Fin-elim : ∀ {p} (P : ∀ n → Fin n → Set p) + (s : ∀ {n} {fn : Fin n} → P n fn → P (suc n) (fsuc fn)) + (z : ∀ {n} → P (suc n) fzero) → + ∀ {n} (fn : Fin n) → P n fn +Fin-elim P s z fzero = z +Fin-elim P s z (fsuc x) = s (Fin-elim P s z x) + +Nope0 : ℕ → Set +Nope0 = ℕ-elim (λ _ → Set) (λ _ → ⊤) ⊥ + +-- Nope1 zero = ⊥ +-- Nope1 (suc _) = ⊤ + +bad : Fin 0 → ⊥ +bad = Fin-elim (λ n _ → Nope0 n) (λ _ → _) _ + + +-- http://stackoverflow.com/questions/18347542/agda-how-does-one-obtain-a-value-of-a-dependent-type + +even : ℕ -> Set +even zero = ⊤ +even (suc zero) = ⊥ +even (suc (suc n)) = even n + +div : (n : ℕ) -> even n -> ℕ +div zero p = zero +div (suc (suc n)) p = suc (div n p) +div (suc zero) () + +proof : (suc (suc zero) + (suc (suc (suc zero)))) ≡ (suc (suc (suc (suc (suc zero))))) +proof = refl + +-- data ⊥ : Set where +-- +-- ¬_ : Set → Set +-- ¬ A = A → ⊥ +-- +-- data Dec (P : Set) : Set where +-- yes : P → Dec P +-- no : ¬ P → Dec P + +EvenDecidable : Set +EvenDecidable = ∀ n → Dec (even n) + +isEven : EvenDecidable +isEven zero = yes _ +isEven (suc zero) = no λ () +isEven (suc (suc n)) = isEven n + +data Bool : Set where + true false : Bool + +if_then_else_ : {A : Set} → Bool → A → A → A +if true then t else _ = t +if false then _ else f = f + +⌊_⌋ : {P : Set} → Dec P → Bool +⌊ yes _ ⌋ = true +⌊ no _ ⌋ = false + +bad1 : ∀ n → even n → even (suc n) → ⊥ +bad1 zero p q = q +bad1 (suc zero) p q = p +bad1 (suc (suc n)) p q = bad1 n p q + +odd : ∀ n → ¬ even n → even (suc n) +odd zero p = p _ +odd (suc zero) p = _ +odd (suc (suc n)) p = odd n p + +g : ℕ → ℕ +g n with isEven n +... | yes e = div n e +... | no o = div (suc n) (odd n o) + +-- g-bad : ℕ → ℕ +-- g-bad n = if ⌊ isEven n ⌋ +-- then (div n {!!}) +-- else (div (suc n) (odd n {!!})) + + +if-dec_then_else_ : {P A : Set} → Dec P → (P → A) → (¬ P → A) → A +if-dec yes p then t else _ = t p +if-dec no ¬p then _ else f = f ¬p + +g' : ℕ → ℕ +g' n = if-dec isEven n + then (λ e → div n e) + else (λ o → div (suc n) (odd n o)) + +if-syntax = if-dec_then_else_ + +syntax if-syntax dec (λ yup → yupCase) (λ nope → nopeCase) + = if-dec dec then[ yup ] yupCase else[ nope ] nopeCase + +g'' : ℕ → ℕ +g'' n = if-dec isEven n + then[ e ] div n e + else[ o ] div (suc n) (odd n o) + + +mod : ℕ -> ℕ +mod zero = zero +mod (suc zero) = suc zero +mod (suc (suc N)) = mod N + +lemma1 : { n : ℕ } -> mod (suc (suc n )) ≡ mod n +lemma1 = refl + +lemma2 : { n : ℕ } -> isEven (suc (suc n )) ≡ isEven n +lemma2 = refl + + +proof1 : (n : ℕ ) -> ( if ⌊ isEven n ⌋ then zero else (suc zero) ) ≡ ( mod n ) +proof1 zero = refl +proof1 (suc zero) = refl +proof1 (suc (suc n)) = let open ≡-Reasoning in + begin + if ⌊ isEven (suc (suc n)) ⌋ then zero else suc zero + ≡⟨ cong ( \x -> (if ⌊ x ⌋ then zero else suc zero)) (lemma2 {n} )⟩ + if ⌊ isEven n ⌋ then zero else suc zero + ≡⟨ proof1 n ⟩ + mod n + ≡⟨ sym (lemma1 {n}) ⟩ + mod (suc (suc n)) + ∎ + +