181 lines
5.6 KiB
Agda
181 lines
5.6 KiB
Agda
{-# OPTIONS --prop #-}
|
||
|
||
open import Agda.Builtin.Nat hiding (zero)
|
||
|
||
module InfinitaryFirstOrderKripkeGeneral (Term : Set) (R : Nat → Set) where
|
||
|
||
open import ListUtil
|
||
open import PropUtil
|
||
open import InfinitaryFirstOrderLogic Term R using (Form; Args; Rel; _⇒_; _∧∧_; ⊤⊤; ∀∀; Con)
|
||
|
||
open import InfinitaryFirstOrderKripke Term R using (Kripke)
|
||
|
||
record Preorder (T : Set₀) : Set₁ where
|
||
constructor order
|
||
field
|
||
_≤_ : T → T → Prop
|
||
refl≤ : {a : T} → a ≤ a
|
||
tran≤ : {a b c : T} → a ≤ b → b ≤ c → a ≤ c
|
||
|
||
[_]ᵒᵖ : {T : Set₀} → Preorder T → Preorder T
|
||
[_]ᵒᵖ o = order (λ a b → (Preorder._≤_ o) b a) (Preorder.refl≤ o) (λ h₁ h₂ → (Preorder.tran≤ o) h₂ h₁)
|
||
|
||
record NormalAndNeutral : Set₁ where
|
||
field
|
||
_⊢⁰_ : Con → Form → Prop
|
||
_⊢*_ : Con → Form → Prop
|
||
zero : {Γ : Con} → {F : Form} → (F ∷ Γ) ⊢⁰ F
|
||
app : {Γ : Con} → {F G : Form} → Γ ⊢⁰ (F ⇒ G) → Γ ⊢* F → Γ ⊢⁰ G
|
||
ande₁ : {Γ : Con} → {F G : Form} → Γ ⊢⁰ (F ∧∧ G) → Γ ⊢⁰ F
|
||
ande₂ : {Γ : Con} → {F G : Form} → Γ ⊢⁰ (F ∧∧ G) → Γ ⊢⁰ G
|
||
∀e : {Γ : Con} → {F : Term → Form} → Γ ⊢⁰ (∀∀ F) → ( {t : Term} → Γ ⊢⁰ (F t) )
|
||
neu⁰ : {Γ : Con} → {n : Nat} → {r : R n} → {A : Args n} → Γ ⊢⁰ Rel r A → Γ ⊢* Rel r A
|
||
lam : {Γ : Con} → {F G : Form} → (F ∷ Γ) ⊢* G → Γ ⊢* (F ⇒ G)
|
||
andi : {Γ : Con} → {F G : Form} → Γ ⊢* F → Γ ⊢* G → Γ ⊢* (F ∧∧ G)
|
||
∀i : {Γ : Con} → {F : Term → Form} → ({t : Term} → Γ ⊢* F t) → Γ ⊢* ∀∀ F
|
||
true : {Γ : Con} → Γ ⊢* ⊤⊤
|
||
|
||
record NormalizationFrame : Set₁ where
|
||
field
|
||
o : Preorder Con
|
||
nn : NormalAndNeutral
|
||
retro : {Γ Δ : Con} → {F : Form} → (Preorder._≤_ o) Γ Δ → (Preorder._≤_ o) Γ (F ∷ Δ)
|
||
⊢tran : {Γ Δ : Con} → {F : Form} → (Preorder._≤_ o) Γ Δ → (NormalAndNeutral._⊢⁰_ nn) Γ F → (NormalAndNeutral._⊢⁰_ nn) Δ F
|
||
|
||
open Preorder o
|
||
open NormalAndNeutral nn
|
||
|
||
|
||
UK : Kripke
|
||
UK = record {
|
||
Worlds = Con;
|
||
_≤_ = _≤_;
|
||
refl≤ = refl≤;
|
||
tran≤ = tran≤;
|
||
_⊩_[_] = λ Γ r A → Γ ⊢⁰ Rel r A;
|
||
mon⊩ = λ Γ h → ⊢tran Γ h
|
||
}
|
||
|
||
open Kripke UK
|
||
|
||
-- q is quote, u is unquote
|
||
q : {F : Form} → {Γ : Con} → Γ ⊩ᶠ F → Γ ⊢* F
|
||
u : {F : Form} → {Γ : Con} → Γ ⊢⁰ F → Γ ⊩ᶠ F
|
||
|
||
u {Rel r A} h = h
|
||
u {F ⇒ F₁} h {Γ'} iq hF = u {F₁} (app {Γ'} {F} {F₁} (⊢tran iq h) (q hF))
|
||
u {F ∧∧ G} h = ⟨ (u {F} (ande₁ h)) , (u {G} (ande₂ h)) ⟩
|
||
u {⊤⊤} h = tt
|
||
u {∀∀ F} h {t} = u {F t} (∀e h {t})
|
||
|
||
q {Rel r A} h = neu⁰ h
|
||
q {F ⇒ F₁} {Γ} h = lam (q (h (retro (Preorder.refl≤ o)) (u {F} {F ∷ Γ} zero)))
|
||
q {F ∧∧ G} ⟨ hF , hG ⟩ = andi (q {F} hF) (q {G} hG)
|
||
q {⊤⊤} h = true
|
||
q {∀∀ F} h = ∀i λ {t} → q {F t} h
|
||
|
||
|
||
module NormalizationTests where
|
||
|
||
{- Now using our records -}
|
||
open import InfinitaryFirstOrderLogic Term R hiding (Form; _⇒_; Con)
|
||
|
||
|
||
ClassicNN : NormalAndNeutral
|
||
ClassicNN = record
|
||
{
|
||
_⊢⁰_ = _⊢⁰_ ;
|
||
_⊢*_ = _⊢*_ ;
|
||
zero = zero zero∈ ;
|
||
app = app ;
|
||
ande₁ = ande₁;
|
||
ande₂ = ande₂ ;
|
||
neu⁰ = neu⁰ ;
|
||
lam = lam ;
|
||
andi = andi ;
|
||
true = true ;
|
||
∀i = ∀i ;
|
||
∀e = ∀e
|
||
}
|
||
|
||
BiggestNN : NormalAndNeutral
|
||
BiggestNN = record
|
||
{
|
||
_⊢⁰_ = _⊢_ ;
|
||
_⊢*_ = _⊢_ ;
|
||
zero = zero zero∈ ;
|
||
app = app ;
|
||
ande₁ = ande₁ ;
|
||
ande₂ = ande₂ ;
|
||
neu⁰ = λ x → x ;
|
||
lam = lam ;
|
||
andi = andi ;
|
||
true = true ;
|
||
∀i = ∀i ;
|
||
∀e = ∀e
|
||
}
|
||
|
||
PO⊢⁺ = [ order {Con} _⊢⁺_ refl⊢⁺ tran⊢⁺ ]ᵒᵖ
|
||
PO⊢⁰⁺ = [ order {Con} _⊢⁰⁺_ refl⊢⁰⁺ tran⊢⁰⁺ ]ᵒᵖ
|
||
PO∈* = order {Con} _∈*_ refl∈* tran∈*
|
||
PO⊂⁺ = order {Con} _⊂⁺_ refl⊂⁺ tran⊂⁺
|
||
PO⊂ = order {Con} _⊂_ refl⊂ tran⊂
|
||
PO⊆ = order {Con} _⊆_ refl⊆ tran⊆
|
||
|
||
-- Completeness Proofs
|
||
Frame⊢ : NormalizationFrame
|
||
Frame⊢ = record
|
||
{
|
||
o = PO⊢⁺ ;
|
||
nn = BiggestNN ;
|
||
retro = λ s → addhyp⊢⁺ (right∈* refl∈*) s ;
|
||
⊢tran = halftran⊢⁺
|
||
}
|
||
|
||
Frame⊢⁰ : NormalizationFrame
|
||
Frame⊢⁰ = record
|
||
{
|
||
o = PO⊢⁰⁺ ;
|
||
nn = ClassicNN ;
|
||
retro = λ s → addhyp⊢⁰⁺ (right∈* refl∈*) s ;
|
||
⊢tran = halftran⊢⁰⁺⁰
|
||
}
|
||
|
||
Frame∈* : NormalizationFrame
|
||
Frame∈* = record
|
||
{
|
||
o = PO∈* ;
|
||
nn = ClassicNN ;
|
||
retro = right∈* ;
|
||
⊢tran = λ s h → halftran⊢⁰⁺⁰ (mon∈*⊢⁰⁺ s) h
|
||
}
|
||
|
||
Frame⊂⁺ : NormalizationFrame
|
||
Frame⊂⁺ = record
|
||
{
|
||
o = PO⊂⁺ ;
|
||
nn = ClassicNN ;
|
||
retro = next⊂⁺ ;
|
||
⊢tran = λ s h → halftran⊢⁰⁺⁰ (mon∈*⊢⁰⁺ $ ⊂⁺→∈* s) h
|
||
}
|
||
|
||
Frame⊂ : NormalizationFrame
|
||
Frame⊂ = record
|
||
{
|
||
o = PO⊂ ;
|
||
nn = ClassicNN ;
|
||
retro = next⊂ ;
|
||
⊢tran = λ s h → halftran⊢⁰⁺⁰ (mon∈*⊢⁰⁺ $ ⊂⁺→∈* $ ⊂→⊂⁺ s) h
|
||
}
|
||
|
||
Frame⊆ : NormalizationFrame
|
||
Frame⊆ = record
|
||
{
|
||
o = PO⊆ ;
|
||
nn = ClassicNN ;
|
||
retro = next⊆ ;
|
||
⊢tran = λ s h → halftran⊢⁰⁺⁰ (mon∈*⊢⁰⁺ $ ⊂⁺→∈* $ ⊂→⊂⁺ $ ⊆→⊂ s) h
|
||
}
|
||
|
||
|