2023-08-01 14:19:28 +02:00
2023-07-20 11:55:25 +02:00
2023-07-20 11:55:25 +02:00

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{-# OPTIONS --prop --rewriting #-}

module Readme where

-- We will use String as propositional variables
postulate String : Set
{-# BUILTIN STRING String #-}

open import PropUtil
open import ListUtil

-- We can use the basic propositional logic
open import ZOL String

-- Here is an example of a propositional formula and its proof
-- The formula is (Q → R) → (P → Q) → P → R
zol-ex : [] ⊢ ((Var "Q") ⇒ (Var "R")) ⇒ ((Var "P") ⇒ (Var "Q")) ⇒ (Var "P") ⇒ (Var "R")
zol-ex = lam (lam (lam (app (zero $ next∈ $ next∈ zero∈) (app (zero $ next∈ zero∈) (zero zero∈)))))

-- We can with the basic interpretation ⟦_⟧ prove that some formulæ are not provable
-- For example, we can disprove (P → Q) → P 's provability as we can construct an
-- environnement where the statement doesn't hold
ρ₀ : Env
ρ₀ "P" = ⊥
ρ₀ "Q" = 
ρ₀ _ = ⊥
zol-cex : ([] ⊢ (((Var "P") ⇒ (Var "Q")) ⇒ (Var "P"))) → ⊥
zol-cex h = ⟦ h ⟧ᵈ {ρ₀} tt λ x → tt

-- But this is not enough to show the non-provability of every non-provable statement.
-- Let's take as an example Pierce formula : ((P → Q) → P) → P
-- This statement is equivalent to the law of excluded middle (Tertium Non Datur)
-- We show that fact in Agda's proposition system

Pierce = {P Q : Prop} → ((P → Q) → P) → P
TND : Prop → Prop
TND P = P  (¬ P)

-- Lemma: The double negation of the TND is always true
-- (You cannot show that having neither a proposition nor its negation is impossible
nnTND : {P : Prop} → ¬ (¬ (P  ¬ P))
nnTND ntnd = ntnd (inj₂ λ p → ntnd (inj₁ p))
P→TND : Pierce → {P : Prop} → TND P
P→TND pierce {P} = pierce {TND P} {⊥} (λ p → case⊥ (nnTND p))
TND→P : ({P : Prop} → TND P) → Pierce
TND→P tnd {P} {Q} pqp = dis (tnd {P}) (λ p → p) (λ np → pqp (λ p → case⊥ (np p)))


-- So we have to use a model that is more powerful : Kripke models
-- With those models, one can describe a frame in which the pierce formula doesn't hold
-- As we have that any proven formula is *true* in a kripke model, this shows
-- that the Pierce formula cannot be proven

-- We import the general definition of Kripke models
open import ZOLKripke String

-- We will now create a specific Kripke model in which Pierce formula doesn't hold

module PierceDisproof where
  
  module PierceWorld where
    data Worlds : Set where
      w₁ w₂ : Worlds
    data _≤_ : Worlds → Worlds → Prop where
      w₁₁ : w₁ ≤ w₁
      w₁₂ : w₁ ≤ w₂
      w₂₂ : w₂ ≤ w₂
    data _⊩_ : Worlds → String → Prop where
      w₂A : w₂ ⊩ "A"
  
    refl≤ : {w : Worlds} → w ≤ w
    refl≤ {w₁} = w₁₁
    refl≤ {w₂} = w₂₂
    tran≤ : {w w' w'' : Worlds} → w ≤ w' → w' ≤ w'' → w ≤ w''
    tran≤ w₁₁ z = z
    tran≤ w₁₂ w₂₂ = w₁₂
    tran≤ w₂₂ w₂₂ = w₂₂
    mon⊩ : {a b : Worlds} → a ≤ b → {p : String} → a ⊩ p → b ⊩ p
    mon⊩ w₂₂ w₂A = w₂A
    
  PierceW : Kripke
  PierceW = record {PierceWorld}
  open Kripke PierceW
  open PierceWorld using (w₁ ; w₂ ; w₁₁ ; w₁₂ ; w₂₂ ; w₂A)
  
  -- Now we can write the «instance» of the Pierce formula which doesn't hold in our world
  PierceF : Form 
  PierceF = (((Var "A" ⇒ Var "B") ⇒ Var "A") ⇒ Var "A")
  
  -- Now we show that it does not hold in w₁ but holds in w₂
  Pierce⊥w₁ : ¬(w₁ ⊩ᶠ PierceF)
  Piercew₂ : w₂ ⊩ᶠ PierceF
  
  -- A does not hold in w₁
  NotAw₁ : ¬(w₁ ⊩ᶠ (Var "A"))
  NotAw₁ ()
  -- B does not hold in w₂ while A holds
  NotBw₂ : ¬(w₂ ⊩ᶠ (Var "B"))
  NotBw₂ ()
  -- Therefore, (A → B) does not hold in w₁
  NotABw₁ : ¬(w₁ ⊩ᶠ (Var "A" ⇒ Var "B"))
  NotABw₁ h = NotBw₂ (h w₁₂ w₂A)
  -- So the hypothesis of the pierce formula does hold in w₁
  -- as its premice does not hold in w₁ and its conclusion does hold in w₂
  PierceHypw₁ : w₁ ⊩ᶠ ((Var "A" ⇒ Var "B") ⇒ Var "A")
  PierceHypw₁ w₁₁ x = case⊥ (NotABw₁ x)
  PierceHypw₁ w₁₂ x = w₂A
  -- So, as the conclusion of the pierce formula does not hold in w₁, the pierce formula doesn't hold.
  Pierce⊥w₁ h = case⊥ (NotAw₁ (h w₁₁ PierceHypw₁))
  -- Finally, the formula holds in w₂ as its conclusion is true
  Piercew₂ w₂₂ h₂ = w₂A

  -- So, if pierce formula would be provable, it would hold in w₁, which it doesn't
  -- therefore it is not provable CQFD
  PierceNotProvable : ¬([] ⊢ PierceF)
  PierceNotProvable h = Pierce⊥w₁ (⟦ h ⟧ {w₁} tt)
  
  
module GeneralizationInZOL where

  -- With Kripke models, we can even prove completeness of ZOL
  -- Using the Universal Kripke Model
  
  -- With a slightly different universal model (using normal and neutral forms),
  -- we can make a normalization proof
  
  -- This normalization proof has first been made in the biggest Kripke model possible
  -- that is, the one using the relation ⊢⁰⁺
  -- But we can also prove it with tighter relations: ∈*, ⊂⁺, ⊂, ⊆

  -- As all those proofs are really similar, we created a NormalizationFrame structure
  -- that computes most of the proofs with only a few lemmas
  open import ZOLNormalization String

  -- We now have access to quote and unquote functions with this
  u1 = NormalizationFrame.u NormalizationTests.Frame⊢
  q1 = NormalizationFrame.q NormalizationTests.Frame⊢
  u2 = NormalizationFrame.u NormalizationTests.Frame⊢⁰
  q2 = NormalizationFrame.q NormalizationTests.Frame⊢⁰
  u3 = NormalizationFrame.u NormalizationTests.Frame∈*
  q3 = NormalizationFrame.q NormalizationTests.Frame∈*
  u4 = NormalizationFrame.u NormalizationTests.Frame⊂⁺
  q4 = NormalizationFrame.q NormalizationTests.Frame⊂⁺
  u5 = NormalizationFrame.u NormalizationTests.Frame⊂
  q5 = NormalizationFrame.q NormalizationTests.Frame⊂
  u6 = NormalizationFrame.u NormalizationTests.Frame⊆
  q6 = NormalizationFrame.q NormalizationTests.Frame⊆

module GeneralizationInIFOL where

  -- We also did implement infinitary first order logic
  -- (i.e. ∀ is like an infinitary ∧)
  -- The proofs works the same with only little modifications

  open import IFOLNormalization String (λ n → String)

  u1 = NormalizationFrame.u NormalizationTests.Frame⊢
  q1 = NormalizationFrame.q NormalizationTests.Frame⊢
  u2 = NormalizationFrame.u NormalizationTests.Frame⊢⁰
  q2 = NormalizationFrame.q NormalizationTests.Frame⊢⁰
  u3 = NormalizationFrame.u NormalizationTests.Frame∈*
  q3 = NormalizationFrame.q NormalizationTests.Frame∈*
  u4 = NormalizationFrame.u NormalizationTests.Frame⊂⁺
  q4 = NormalizationFrame.q NormalizationTests.Frame⊂⁺
  u5 = NormalizationFrame.u NormalizationTests.Frame⊂
  q5 = NormalizationFrame.q NormalizationTests.Frame⊂
  u6 = NormalizationFrame.u NormalizationTests.Frame⊆
  q6 = NormalizationFrame.q NormalizationTests.Frame⊆


module NormalizationInFFOL where

  -- We also did an implementation of the negative fragment
  -- of finitary first order logic (∀ is defined with context extension)

  -- The algebra has been written in this file
  -- There is also the class of Tarski models, written as an example
  open import FFOL

  -- We have also written the syntax (initial model)
  -- (a lot of transport hell, but i did it !)
  open import FFOLInitial

  -- And now, we can finally write the class of Family and Presheaf models
  -- and we can make the proof of completeness of the latter.
  open import FFOLCompleteness



Description
No description provided
Readme 253 KiB
Languages
Agda 78.1%
TeX 20.6%
Makefile 0.8%
HTML 0.3%
Awk 0.2%