The Untyped Concatenative Calculus

This is a partial formalization of Scott J Maddox’s Untyped Concatenative Calculus.

Imports

open import Data.Product hiding (swap; _,′_)
open import Data.Nat
open import Function hiding (_∘′_)
open import Relation.Binary
open import Relation.Binary.PropositionalEquality

Definitions

Intrinsics & Expressions

data Int : Set where
  swap    : Int
  clone   : Int
  drop    : Int
  quot    : Int
  compose : Int
  apply   : Int

infix  5 [_]
infixl 7 _∘′_
infix  9 `_

data Expr : Set where
  `_   : Int  Expr
  [_]  : Expr  Expr
  _∘′_ : Expr  Expr  Expr

Values and the Stack

data Value : Expr  Set where
  ⟦_⟧ : (e : Expr)  Value [ e ]

infixl 4 _,′_

data Stack : Set where
  ⟨⟩  : Stack
  _,′_ :  {e}
        (V : Stack)
        (v : Value e)
        Stack

Small-Step Semantics

infix 3 ⟨_⟩_→⟨_⟩

data ⟨_⟩_→⟨_⟩ : Stack  Expr  Stack  Set where

Intrinsics

  i-swap :  {V e e′}
          (v : Value e)
          (v′ : Value e′)
           -----------------------------------------
           V ,′ v ,′ v′  ` swap →⟨ V ,′ v′ ,′ v 

  i-clone :  {V e}
           (v : Value e)
            -----------------------------------
            V ,′ v  ` clone →⟨ V ,′ v ,′ v 

  i-drop :  {V e}
            (v : Value e)
             ------------------------
             V ,′ v  ` drop →⟨ V 

  i-quote :  {V e}
             (v : Value e)
              ---------------------------------
              V ,′ v  ` quot →⟨ V ,′  e  

  i-compose :  {V e e′}
              --------------------------------------------------------
              V ,′  e  ,′  e′   ` compose →⟨ V ,′  e ∘′ e′  

  i-apply :  {V V′ e}
            V  e →⟨ V′ 
            ------------------------------
            V ,′  e   ` apply →⟨ V′ 

Expressions

  e-quote :  {V e}
            ---------------------------
            V  [ e ] →⟨ V ,′  e  

  _e-∘_ :  {V V′ W e e′}
          V   e  →⟨ V′ 
          V′  e′ →⟨ W  
          --------------------
          V  e ∘′ e′ →⟨ W 

Properties

Composition

e-comp-assoc′ :  {V W e₁ e₂ e₃}   V  (e₁ ∘′ e₂) ∘′ e₃ →⟨ W    V  e₁ ∘′ (e₂ ∘′ e₃) →⟨ W 
e-comp-assoc′
  = mk↔
    {f = λ{ ((l e-∘ l₁) e-∘ r)  l e-∘ (l₁ e-∘ r) }}
    {f⁻¹ = λ{ (l e-∘ (r e-∘ r₁))  (l e-∘ r) e-∘ r₁ }}
    ((λ{ (l e-∘ (r e-∘ r₁))  refl }) , λ{ ((l e-∘ l₁) e-∘ r)  refl })

Data Types

Booleans

⊥ = [ \text{drop} ]

 : Expr
 = [ ` drop ]

⊥ᵥ : Value 
⊥ᵥ =  ` drop 

⊤ = [ \text{swap} \ \text{drop} ]

 : Expr
 = [ ` swap ∘′ ` drop ]

⊤ᵥ : Value 
⊤ᵥ =  ` swap ∘′ ` drop 

Properties

⊥-thm :  {V e e′}
       (v : Value e)
       (v′ : Value e′)
        V ,′ v ,′ v′   ∘′ ` apply →⟨ V ,′ v 
⊥-thm {V} v v′ = e-quote e-∘ i-apply (i-drop v′)

⊤-thm :  {V e e′}
       (v : Value e)
       (v′ : Value e′)
        V ,′ v ,′ v′   ∘′ ` apply →⟨ V ,′ v′ 
⊤-thm {V} {e} {e′} v v′ = e-quote e-∘ i-apply (i-swap v v′ e-∘ i-drop v)

Boolean Operations

 : Expr
 = ` clone ∘′ ` apply

Operations

∨-⊥-⊥ :  {V e}   V ,′  e  ,′ ⊥ᵥ   →⟨ V ,′  e  
∨-⊥-⊥ = i-clone  ` drop  e-∘ i-apply (i-drop  ` drop )

∨-⊤ :  {V e}   V ,′  e  ,′ ⊤ᵥ   →⟨ V ,′ ⊤ᵥ 
∨-⊤ {V} {e} = i-clone  ` swap ∘′ ` drop  e-∘
                i-apply (i-swap  e   ` swap ∘′ ` drop  e-∘ i-drop  e )

Useful Terms

Quotation

quoteₙ :   Expr
quoteₙ zero = ` quot
quoteₙ (suc n) = quoteₙ n ∘′ ` swap ∘′ ` quot ∘′ ` swap ∘′ ` compose

Properties

quote₂-thm :  {V e e′}
            (v : Value e)
            (v′ : Value e′)
             -------------------------------------------
             V ,′ v ,′ v′  quoteₙ 1 →⟨ V ,′  e ∘′ e′  
quote₂-thm {V} {e} {e′} v v′ = (((i-quote v′ e-∘ i-swap v  e′ ) e-∘ i-quote v) e-∘
                                  i-swap  e′   e )
                                 e-∘ i-compose

Composition

composeₙ :   Expr
composeₙ zero = ` compose
composeₙ (suc n) = ` compose ∘′ composeₙ n

– TODO: Canonical forms – TODO: Progress – TODO: Preservation – TODO: Evaluation