deniok: (typed lambda)
[personal profile] deniok
Читая в прошедшем семестре курс матлогики, придумывал разные задачки для практики и многие решал (для себя) на Агде. Сейчас сел все это упорядочивать. Обнаружил, что сопоставление с образцом, конечно же, обыгрывает явные элиминаторы по выразительности при записи доказательств, но элиминаторы иногда сопротивляются довольно успешно.
Вот, скажем, исчисление высказываний.
Proposition : Set₁
Proposition = Set

_⇒_ : Proposition → Proposition → Proposition
P ⇒ Q = P → Q

data _∨_ (P Q : Proposition) : Proposition where
  injl : P → P ∨ Q
  injr : Q → P ∨ Q

data _∧_ (P Q : Proposition) : Proposition where
  _,_ : P → Q → P ∧ Q

_⇔_ : Proposition → Proposition → Proposition
P ⇔ Q = (P ⇒ Q) ∧ (Q ⇒ P)

Теперь можно доказывать всякие пропозициональные тавтологии. Для чистой импликации
{- комбинатор K -}
⇒-intro : {P Q : Proposition} → 
          P ⇒ Q ⇒ P
⇒-intro p q = p

{- комбинатор S -}
infixl 8 _ˢ_
_ˢ_ : {P Q R : Proposition} → 
           (P ⇒ Q ⇒ R) ⇒ (P ⇒ Q) ⇒ P ⇒ R
_ˢ_ p⇒q⇒r p⇒q p = p⇒q⇒r p (p⇒q p)

{- комбинатор B, известный также как композитор -} 
infixr 9 _∘_
_∘_ : {P Q R : Proposition} → 
           (Q ⇒ R) ⇒ (P ⇒ Q) ⇒ P ⇒ R
_∘_ q⇒r p⇒q p = q⇒r (p⇒q p)

Для дизъюнкции можно определить правила введения (они, естественно, совпадают с конструкторами)
∨-intro₁ : {P Q : Proposition} → 
            P ⇒ P ∨ Q
∨-intro₁ = injl 

∨-intro₂ : {P Q : Proposition} → 
            Q ⇒ P ∨ Q
∨-intro₂ = injr
и правило удаления (элиминатор)
∨-elim : {P Q R : Proposition} → 
          (P ⇒ R) ⇒ (Q ⇒ R) ⇒ P ∨ Q ⇒ R
∨-elim p⇒r q⇒r (injl p) = p⇒r p
∨-elim p⇒r q⇒r (injr q) = q⇒r q
Эти правила соответствуют аксиомам гильбертовского исчисления высказываний, сопоставление с образцом дает нам инструмент для доказательства элиминаторов.

Аналогично для конъюнкции
∧-intro : {P Q : Proposition} → 
          P ⇒ Q ⇒ P ∧ Q
∧-intro = _,_ 

∧-elim₁ : {P Q : Proposition} → 
          P ∧ Q ⇒ P
∧-elim₁ (p , _) = p

∧-elim₂ : {P Q : Proposition} → 
          P ∧ Q ⇒ Q
∧-elim₂ (_ , q) = q
(Элиминаторы эти на менее высоколобом языке носят названия fst и snd.)

Теперь можно писать доказательства тавтологий на двух языках. Например, коммутативность конъюнкции: через сопоставление с образцом
∨-comm : {P Q : Proposition} → 
         P ∨ Q ⇒ Q ∨ P
∨-comm (injl p) = injr p
∨-comm (injr q) = injl q
и через интродьюсеры-элиминаторы
∨-comm' : {P Q : Proposition} → 
         P ∨ Q ⇒ Q ∨ P
∨-comm' = ∨-elim ∨-intro₂ ∨-intro₁

УПРАЖНЕНИЕ 1. Докажите двумя способами коммутативность конъюнкции
∧-comm : {P Q : Proposition} → 
         P ∧ Q ⇒ Q ∧ P
∧-comm = {!!}

Докажем теперь ассоциативность дизъюнкции. Сначала паттерн-матчингом:
∨-ass₁ : {P Q R : Proposition} → 
         (P ∨ Q) ∨ R ⇒ P ∨ (Q ∨ R)
∨-ass₁ (injl (injl p)) = injl p
∨-ass₁ (injl (injr q)) = injr (injl q)
∨-ass₁ (injr r)        = injr (injr r)
Перепишем теперь все это на языке интродьюсеров-элиминаторов
∨-ass₁' : {P Q R : Proposition} → 
         (P ∨ Q) ∨ R ⇒ P ∨ (Q ∨ R)
∨-ass₁' = ∨-elim                              -- расщепляем (P ∨ Q) или R
                 (∨-elim                      -- расщепляем P или Q 
                         ∨-intro₁             -- если P, то положить влево
                        (∨-intro₂ ∘ ∨-intro₁) -- если Q, то положить вправо, влево
                 ) 
                 (∨-intro₂ ∘ ∨-intro₂)        -- если R, то положить вправо, вправо

УПРАЖНЕНИЕ 2. Докажите двумя способами ассоциативность дизъюнкции в обратном направлении
∨-ass₂ : {P Q R : Proposition} → 
         P ∨ (Q ∨ R) ⇒ (P ∨ Q) ∨ R
∨-ass₂ = {!!}

Теперь можем написать окончательную формулу (с равносильностью, а не с импликациями)
∨-ass : {P Q R : Proposition} → 
         (P ∨ Q) ∨ R ⇔ P ∨ (Q ∨ R)
∨-ass = ∨-ass₁ , ∨-ass₂

Перейдем к ассоциативности конъюнкции. Первый способ (через сопоставление с образцом), конечно, вне конкуренции
∧-ass₁ : {P Q R : Proposition} → 
         (P ∧ Q) ∧ R ⇒ P ∧ (Q ∧ R)
∧-ass₁ ((p , q) , r) =  p , (q , r)
Второй способ требует нудного использования элиминаторов fst (то есть ∧-elim₁) и snd (∧-elim₂)
∧-ass₁' : {P Q R : Proposition} → 
          (P ∧ Q) ∧ R ⇒ P ∧ (Q ∧ R)
∧-ass₁' x = ∧-intro (∧-elim₁ (∧-elim₁ x)) 
                    (∧-intro (∧-elim₂ (∧-elim₁ x)) 
                             (∧-elim₂ x)
                    ) 
Можно переписать это в бесточечном стиле, используя комбинаторы B и S (то есть доказанные выше теоремы)
∧-ass₁'' : {P Q R : Proposition} → 
           (P ∧ Q) ∧ R ⇒ P ∧ (Q ∧ R)
∧-ass₁'' = ∧-intro ∘ ∧-elim₁ ∘ ∧-elim₁ ˢ (∧-intro ∘ ∧-elim₂ ∘ ∧-elim₁ ˢ ∧-elim₂) 

УПРАЖНЕНИЕ 3. Докажите двумя способами ассоциативность конъюнкции в обратном направлении
∧-ass₂ : {P Q R : Proposition} → 
         P ∧ (Q ∧ R) ⇒ (P ∧ Q) ∧ R
∧-ass₂  = {!!}

Исходник можно поглядеть здесь.

Date: 2014-01-06 09:30 am (UTC)
From: [identity profile] dtim.livejournal.com
Как по-твоему, Agda проще или сложнее для восприятия студентами, чем Coq?

Date: 2014-01-06 09:52 am (UTC)
From: [identity profile] deni-ok.livejournal.com
Абстрактному студенту - не знаю. Думаю "математикам" чуть по-легче будет c COQом, а функциональщикам - с Агдой. Ну и по COQ чуть получше с литературой, в смысле толстых книжек, годящихся на роль учебника-справочника.

Date: 2014-01-06 10:24 am (UTC)
From: [identity profile] dtim.livejournal.com
Спасибо.

Profile

deniok: (Default)
deniok

February 2022

S M T W T F S
  12345
6789101112
13141516171819
20212223 242526
2728     

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 24th, 2025 10:51 pm
Powered by Dreamwidth Studios