------------------------------------------------------------------------------
-- The LTC-PCF base
------------------------------------------------------------------------------
{-# OPTIONS --exact-split #-}
{-# OPTIONS --no-sized-types #-}
{-# OPTIONS --no-universe-polymorphism #-}
{-# OPTIONS --without-K #-}
{-
LTC-PCF The logical framework (Agda)
* Logical constants * Curry-Howard isomorphism
* Equality * Identity type
* Term language and conversion rules * Postulates
* Inductively defined predicates * Inductive families
-}
module LTC-PCF.Base where
-- First-order logic with equality.
open import Common.FOL.FOL-Eq public
-- Common definitions.
open import Common.DefinitionsI public
infixl 7 _·_
infix 0 if_then_else_
------------------------------------------------------------------------------
-- The term language of LTC-PCF correspond to the PCF terms.
-- t ::= x
-- | t · t
-- | λ x.t
-- | fix x.t
-- | true | false | if
-- | zero | succ | pred | iszero
-- NB. We define the PCF terms as constants. After that, we will
-- define some function symbols based on these constants for
-- convenience in writing.
postulate
_·_ : D → D → D -- LTC-PCF application.
lam : (D → D) → D -- LTC-PCF λ-abstraction.
fix : (D → D) → D -- LTC-PCF fixed-point operator.
true false if : D -- LTC-PCF partial Booleans.
zero succ pred iszero : D -- LTC-PCF partial natural numbers.
------------------------------------------------------------------------------
-- Definitions
-- We define some function symbols for convenience in writing.
abstract
if_then_else_ : D → D → D → D
if b then t else t' = if · b · t · t'
succ₁ : D → D
succ₁ n = succ · n
pred₁ : D → D
pred₁ n = pred · n
iszero₁ : D → D
iszero₁ n = iszero · n
------------------------------------------------------------------------------
-- Conversion rules
-- The conversion relation _conv_ satifies (Aczel 1977. The strength
-- of Martin-Löf's intuitionistic type theory with one universe,
-- p. 8).
--
-- x conv y <=> FOTC ⊢ x ≡ y,
--
-- therefore, we introduce the conversion rules as non-logical axioms.
-- N.B. We write the conversion rules on the defined function symbols
-- instead of on the PCF constants.
-- Conversion rule for the λ-abstraction and the application.
postulate beta : ∀ f a → lam f · a ≡ f a
-- Conversion rule for the fixed-pointed operator.
postulate fix-eq : ∀ f → fix f ≡ f (fix f)
-- Conversion rules for Booleans.
postulate
-- if-true : ∀ t {t'} → if · true · t · t' ≡ t
-- if-false : ∀ {t} t' → if · false · t · t' ≡ t'
if-true : ∀ t {t'} → (if true then t else t') ≡ t
if-false : ∀ {t} t' → (if false then t else t') ≡ t'
-- Conversion rules for pred.
postulate
-- pred-0 : pred · zero ≡ zero
-- pred-S : ∀ d → pred · (succ · d) ≡ d
-- N.B. We don't need this equation in FOTC.
pred-0 : pred₁ zero ≡ zero
pred-S : ∀ n → pred₁ (succ₁ n) ≡ n
-- Conversion rules for iszero.
postulate
-- iszero-0 : iszero · zero ≡ true
-- iszero-S : ∀ d → iszero · (succ · d) ≡ false
iszero-0 : iszero₁ zero ≡ true
iszero-S : ∀ n → iszero₁ (succ₁ n) ≡ false
------------------------------------------------------------------------------
-- Discrimination rules
postulate
t≢f : true ≢ false
-- 0≢S : ∀ {d} → zero ≢ succ · d
0≢S : ∀ {n} → zero ≢ succ₁ n