Falsoを使ってみた?

あらまし

http://twitter.com/MoCo7/status/19336249733

MoCo7さんのretweetで発見

ティンと来た!!!

http://estatis.coders.fm/falso/

なんかCoqっぽいコードがあるけど何やってるか分かりません。

Agda2で

{-# OPTIONS --universe-polymorphism #-}

module Falso where

import Level
open import Data.Nat

data ⊥ : Set0 where

absurd : {n : Level.Level}{P : Set n} -> ⊥ -> P
absurd ()

data _==_ {n : Level.Level} {A : Set n} : A -> A -> Set n where
  refl : (a : A) -> a == a

data Falso {n : Level.Level} (P : Set n) : Set n where
  falso : ⊥ -> Falso P

falso→agda2 : {n : Level.Level}{P : Set n} -> Falso P -> P
falso→agda2 (falso b) = absurd b

postulate agda2→falso : {n : Level.Level}{P : Set n} -> P -> Falso P

¬ : {n : Level.Level} (P : Set n) -> Set n
¬ p = p -> ⊥

lem : {n1 n2 : Level.Level}{P : Set n1}{Q : Set n2} ->
      ((Falso P) -> Q) -> (P -> Q)
lem p→q = (λ p' → p→q (agda2→falso p'))

1==2 : 1 == 2
1==2 = proof
  where
    assume : Falso (¬ (1 == 2)) → ⊥
    assume (falso b) = b

    ¬¬1==2 : ¬(¬(1 == 2))
    ¬¬1==2 = lem assume

    お腹空いた : Falso (¬(¬(1 == 2)))
    お腹空いた = agda2→falso ¬¬1==2

    proof : 1 == 2
    proof with お腹空いた
    ... | (falso b) = absurd b

くそ暑いんですけど・・・。あとコレであってるのかなぁ・・・。

agda2→falsoは必要だと思うんですけど。