-- Simply-typed lambda definability and normalization by evaluation
-- formalized in Agda
--
-- Author: Andreas Abel, May/June 2018
-- 4. Using Kripke predicates to refute STLC-definability of an inhabitant of Peirce's formula.
-- There is no λ-definable function in the Peirce type ((A → B) → A) → A
{-# OPTIONS --postfix-projections #-}
{-# OPTIONS --rewriting #-}
open import Library
import SimpleTypes
import STLCDefinable
module PeirceNotDefinable where
-- We consider the Peirce formula over two "empty" base types:
data Base : Set where
a b : Base
-- In the set-interpretation, the types are actually not empty.
-- If they were, we would not be able to get the necessary witnesses.
B⦅_⦆ : Base → Set
B⦅ _ ⦆ = ⊤
-- We consider λ-calculus with no constants
open SimpleTypes Base B⦅_⦆
open STLCDefinable Base B⦅_⦆ ⊥ ⊥-elim (λ())
A = base a
B = base b
-- A counter model to the Peirce type:
-- We interpret A as being-a-projection
-- and B as the empty predicate.
IsProjection : ∀ Γ T (f : Fun Γ T) → Set
IsProjection Γ T f = ∃ λ (x : Var T Γ) → f ≡ V⦅ x ⦆
NP-Base : STLC-KLP-Base
NP-Base .STLC-KLP-Base.B⟦_⟧ a Γ f = IsProjection Γ A f
NP-Base .STLC-KLP-Base.B⟦_⟧ b Γ f = ⊥ -- b is always empty
NP-Base .STLC-KLP-Base.monB a τ (x , refl) = x w[ τ ]ᵛ , sym (wk-evalv x τ)
NP-Base .STLC-KLP-Base.monB b τ ()
NP : STLC-KLP
NP .STLCDefinable.STLC-KLP.klp-base = NP-Base
NP .STLCDefinable.STLC-KLP.satC ()
Peirce = ((A ⇒ B) ⇒ A) ⇒ A
-- Lemma: Cannot project anything from the empty context.
no-proj-from-ε : ∀ T {f : Fun ε T} (p : IsProjection ε T f) → ⊥
no-proj-from-ε _ (() , _)
-- Theorem: the Peirce type is not inhabited in STLC.
-- The argument runs just like the Kripke countermodel for Peirce in IPL.
-- We can drop the functions like f since we interpeted A and B as ⊤
-- in the set-theoretic interpretation.
-- Proof: Suppose ⟦ Pierce ⟧ ε and derive a contradiction.
-- Since ⟦ A ⟧ ε is false ("no-proj-from-ε A"), it is sufficient to show ⟦ (A → B) → A ⟧ ε.
-- Assume τ : Δ ≤ ε and ⟦ A → B ⟧ Δ. We show ⟦ A ⟧ Δ by absurdity of ⟦ A → B ⟧ Δ ("lemma").
-- To this end, note that ⟦ A ⟧ (Δ.A) holds while ⟦ B ⟧ (Δ.A) is false (irrespective of Δ).
thm : ∀ f → STLC-definable ε Peirce f → ⊥
thm f def = no-proj-from-ε A (def NP id≤ (λ τ ⟦d⟧ → lemma ⟦d⟧))
where
open STLC-KLP NP
-- Lemma: T⟦ A ⇒ B ⟧ Δ is always false.
lemma : ∀ {Δ d} → T⟦ A ⇒ B ⟧ Δ d → ∀{X : Set} → X
lemma ⟦d⟧ = case ⟦d⟧ (weak id≤) (vz , refl) of λ()
-- Q.E.D.