Skip to content

Instantly share code, notes, and snippets.

@kdxu
Created March 28, 2015 02:07
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kdxu/3ecf21603abe9e9a409e to your computer and use it in GitHub Desktop.
Save kdxu/3ecf21603abe9e9a409e to your computer and use it in GitHub Desktop.
module A2 where
------------------------------------------------------
-- 述語論理
-- まずは命題論理から
-- 真(⊤),偽(⊥)の定義が必要
-- ⊥ は証明がひとつもないような命題だから, 空集合によって表す
-- 帰納的定義によって次のように表現することができる
data ⊥ : Set where
-- record 型は指定された値の型を1組にまとめたもの
-- つまり何も指定しなければ全体の集合すなわち ⊤ が表現できる
record ⊤ : Set where
-- 結合子を構成していく
-- 連言(AかつB)
record _∧_ (P Q : Set) : Set where
field
Elim1 : P
Elim2 : Q
test1 : (P Q : Set) → Set
test1 p q = p ∧ {!!}
test2 : (P : Set) → Set
test2 p = p ∧ ⊥
-- 除去規則 P ∧ Q → P は _∧_.Elim1 のようにかける
lemma1 : (P Q : Set) → P ∧ Q → P
lemma1 p q = _∧_.Elim1
-- 導入規則
∧Intro : {P Q : Set} → P → Q → P ∧ Q
∧Intro p q = record { Elim1 = p ; Elim2 = q }
-- 選言
data _∨_ (P Q : Set) : Set where
∨Intro1 : P → P ∨ Q
∨Intro2 : Q → P ∨ Q
∨Elim : {P Q R : Set} → P ∨ Q → (P → R) → (Q → R) → R
∨Elim (∨Intro1 a) prfP _ = prfP a
∨Elim (∨Intro2 b) _ prfQ = prfQ b
test3 : (P Q : Set) → Set
test3 p q = p ∨ q
lemma2 : (P Q : Set) → P → P ∨ Q
lemma2 p q = ∨Intro1
-- 含意 (PならばQ)
data _⊃_ (P Q : Set) : Set where
⊃Intro : (P → Q) → P ⊃ Q
-- ⊥Elim : 偽の除去規則
-- 存在のしない値は()としてmatchする
⊥Elim : {P : Set} → ⊥ → P
⊥Elim ()
-- ⊃Elim : 導入の除去規則
-- P ⊃ Q 型から P → Q 型の値への写像が存在する
⊃Elim : {P Q : Set} → P ⊃ Q → P → Q
⊃Elim (⊃Intro x) q = x q
-- 否定
-- 否定は p → ⊥ すなわち p ⊃ ⊥ として表現される
¬ : Set → Set
¬ p = p ⊃ ⊥
-- 命題1
-- prop1 : ((A ∧ B) → (A ∨ B))
-- A ∧ B が与えられたら,A から A ∨ B が作れる
prop1 : (A B : Set) → (A ∧ B) ⊃ (A ∨ B)
prop1 A B = {!!}
-- A ∧ B -> A
-- A -> A ∨ B ∨Intro1
-- (A -> B)
--prop1 : (A B : Set) → (A ∧ B) ⊃ (A ∨ B)
--prop1 A B = ⊃Intro (λ x → ∨Intro1 (_∧_.Elim1 x))
-- 述語論理へ
-- all,existを定義
-- 全称
-- この型の値が存在する -> allが書ける
data all (P : Set) (Q : P → Set) : Set where
∀Intro : ((a : P) → Q a) → all P Q
∀Elim : {P : Set} → {Q : P → Set} → all P Q → (a : P) → Q a
∀Elim (∀Intro f) a = f a
-- 存在
-- recordとdataは双対のような存在になっている
-- 指定された値の型を1組にまとめたもの
record exist (P : Set) (Q : P → Set) : Set where
field
evidence : P
Elim : Q evidence
∃Intro : {P : Set} → {Q : P → Set} → (a : P) → Q a → exist P Q
∃Intro a p = record { evidence = a ; Elim = p }
-- prop3 : ∃x (∀y (P x y)) → (∀y (∃x P (x y)))
prop3 : (A B : Set) → (P : A → (B → Set)) →
exist A ((λ x → all B (λ y → P x y))) ⊃ (all B (λ y → exist A (λ x → P x y)))
prop3 A B p = ⊃Intro ( λ (pr : exist A (λ (x : A)
→ all B ( λ (y : B) → p x y))) → ∀Intro (λ (b : B) →
record { evidence = exist.evidence pr ; Elim = ∀Elim (exist.Elim pr) b }))
-- 二重否定除去(DNE)
-- DNE : (P : Set) → ¬ (¬ P) ⊃ P
--または排中律(LEM)
-- LEM : (P : Set) → (P ∨ ¬ P)
--を与える.
-- つまり,not not A が A の世界
-- Agdaは直観論理(マーティン・レーフの直観主義的型理論(ML-ITT))
-- に基づいて構成されているので,二重否定除去律は公理ではない.
-- ¬¬ P → P は示せない!
-- (¬¬¬ P → ¬ P は示せる)
-- postulate(仮定)により拡張してやる
-- postulate DNE : {P : Set} → ¬ (¬ P) ⊃ P
postulate LEM : (P : Set) → (P ∨ ¬ P)
-- この二つは同じ拡張をしているので,一方からもう一方を導き出せる
DNE : (P : Set) → ¬ (¬ P) ⊃ P
DNE p = ⊃Intro (λ x → ∨Elim (LEM p) (λ y → y) (λ z → ⊥Elim (⊃Elim x z)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment