---------------------------------------------------------------------------------------------------------------
--
-- A formalisation of big-step and small-step operational semantics for λ-calculus

module A201903.Everything where

open import A201903.0-1-Prelude
open import A201903.0-1-1-Prelude-StutteringColists
open import A201903.0-1-2-Prelude-MealyLikeMachines
open import A201903.0-1-3-Prelude-ForeignHandleBuffering
open import A201903.0-2-GenericEquipment

open import A201903.1-1-Syntax-Terms
open import A201903.1-2-Syntax-Predicates

import A201903.2-1-Semantics-BigStep as BS
import A201903.2-2-Semantics-SmallStep as SS

import A201903.3-1-Properties-BigStep-CBN
import A201903.3-2-Properties-BigStep-NO
import A201903.3-2-1-Properties-BigStep-NO₂
import A201903.3-3-Properties-BigStep-CBV
import A201903.3-4-Properties-BigStep-AO
import A201903.3-5-Properties-BigStep-HAO
import A201903.3-6-Properties-BigStep-HS
import A201903.3-7-Properties-BigStep-H
import A201903.3-7-1-Properties-BigStep-H₂
import A201903.3-8-Properties-BigStep-HNO
import A201903.3-8-1-Properties-BigStep-HNO₂

import A201903.4-1-Properties-SmallStep-CBN
import A201903.4-2-Properties-SmallStep-NO
import A201903.4-2-1-Properties-SmallStep-NO₂
import A201903.4-3-Properties-SmallStep-CBV
import A201903.4-4-Properties-SmallStep-AO
import A201903.4-5-Properties-SmallStep-HAO
import A201903.4-6-Properties-SmallStep-HS
import A201903.4-7-Properties-SmallStep-H
import A201903.4-7-1-Properties-SmallStep-H₂
import A201903.4-8-Properties-SmallStep-HNO
import A201903.4-8-1-Properties-SmallStep-HNO₂

open import A201903.5-1-Equivalence-CBN
open import A201903.5-2-Equivalence-NO
open import A201903.5-3-Equivalence-CBV
open import A201903.5-4-Equivalence-AO
open import A201903.5-5-Equivalence-HAO
open import A201903.5-6-Equivalence-HS
open import A201903.5-7-Equivalence-H
open import A201903.5-8-Equivalence-HNO

import A201903.Main


---------------------------------------------------------------------------------------------------------------
--
-- Call-by-name reduction to weak head normal form

-- Theorem 5.1.3.  SS-CBN to WHNF and BS-CBN coincide

thm-5-1-3 :  {n} {e : Tm n} {e′}  (e SS.CBN.⇒* e′ × WHNF e′)  e BS.CBN.⟱ e′
thm-5-1-3 = Thm-5-1-3.ss↔bs


---------------------------------------------------------------------------------------------------------------
--
-- Normal order reduction to normal form

-- Theorem 5.2.6.  SS-NO to NF and BS-NO coincide

thm-5-2-6 :  {n} {e : Tm n} {e′}  (e SS.NO.⇒* e′ × NF e′)  e BS.NO.⟱ e′
thm-5-2-6 = Thm-5-2-6.ss↔bs


---------------------------------------------------------------------------------------------------------------
--
-- Call-by-value reduction to weak normal form

-- Theorem 5.3.3.  SS-CBV to WNF and BS-CBV coincide

thm-5-3-3 :  {n} {e : Tm n} {e′}  (e SS.CBV.⇒* e′ × WNF e′)  e BS.CBV.⟱ e′
thm-5-3-3 = Thm-5-3-3.ss↔bs


---------------------------------------------------------------------------------------------------------------
--
-- Applicative order reduction to normal form

-- Theorem 5.4.3.  SS-AO to NF and BS-AO coincide

thm-5-4-3 :  {n} {e : Tm n} {e′}  (e SS.AO.⇒* e′ × NF e′)  e BS.AO.⟱ e′
thm-5-4-3 = Thm-5-4-3.ss↔bs


---------------------------------------------------------------------------------------------------------------
--
-- Hybrid applicative order reduction to normal form

-- Theorem 5.5.3.  SS-HAO to NF and BS-HAO coincide

thm-5-5-3 :  {n} {e : Tm n} {e′}  (e SS.HAO.⇒* e′ × NF e′)  e BS.HAO.⟱ e′
thm-5-5-3 = Thm-5-5-3.ss↔bs


---------------------------------------------------------------------------------------------------------------
--
-- Head spine reduction to head normal form

-- Theorem 5.6.3.  SS-HS to HNF and BS-HS coincide

thm-5-6-3 :  {n} {e : Tm n} {e′}  (e SS.HS.⇒* e′ × HNF e′)  e BS.HS.⟱ e′
thm-5-6-3 = Thm-5-6-3.ss↔bs


---------------------------------------------------------------------------------------------------------------
--
-- Head reduction to head normal form

-- Theorem 5.7.6.  SS-H to HNF and BS-H coincide

thm-5-7-6 :  {n} {e : Tm n} {e′}  (e SS.H.⇒* e′ × HNF e′)  e BS.H.⟱ e′
thm-5-7-6 = Thm-5-7-6.ss↔bs


---------------------------------------------------------------------------------------------------------------
--
-- Hybrid normal order reduction to normal form

-- Theorem 5.8.6.  SS-HNO to NF and BS-HNO coincide

thm-5-8-6 :  {n} {e : Tm n} {e′}  (e SS.HNO.⇒* e′ × NF e′)  e BS.HNO.⟱ e′
thm-5-8-6 = Thm-5-8-6.ss↔bs


---------------------------------------------------------------------------------------------------------------
--
-- References
--
-- * A. Garcia-Perez, et al. (2013)
--   “Deriving the full-reducing Krivine machine from the small-step operational semantics of normal order”
--   http://oa.upm.es/30153/1/30153nogueiraINVES_MEM_2013.pdf
--
-- * J.C. Mitchell (1996)
--   “Foundations for programming languages”
--
-- * L. Paulson (1996)
--   “ML for the working programmer”
--   https://www.cl.cam.ac.uk/~lp15/MLbook/PDF/chapter9.pdf
--
-- * B. Pierce (2001)
--   “Types and programming languages”
--
-- * P. Sestoft (2002)
--   “Demonstrating lambda calculus reduction”
--   http://www.itu.dk/~sestoft/papers/sestoft-lamreduce.pdf
--
-- * G. Winskel (1993)
--   “The formal semantics of programming languages”


---------------------------------------------------------------------------------------------------------------