\begin{code}
module Scm.Auxiliary-Functions where
open import Scm.Notation
open import Scm.Abstract-Syntax
open import Scm.Domain-Equations
postulate _==_ : Ide β Ide β Bool
_[_/_] : π β π β Ide β π
Ο [ Ξ± / I ] = Ξ» Iβ² β Ξ· (I == Iβ²) βΆ Ξ± , Ο Iβ²
postulate unknown : π
postulate initial-env : π
_[_/_]β² : π β π β π β π
Ο [ Ο΅ / Ξ± ]β² = Ξ» Ξ±β² β (Ξ± ==α΄Έ Ξ±β²) βΆ Ο΅ , Ο Ξ±β²
assign : π β π β π β π
assign = Ξ» Ξ± Ο΅ ΞΈ Ο β ΞΈ (Ο [ Ο΅ / Ξ± ]β²)
hold : π β (π β π) β π
hold = Ξ» Ξ± ΞΊ Ο β ΞΊ (Ο Ξ±) Ο
postulate new : (π β π) β π
alloc : π β (π β π) β π
alloc = Ξ» Ο΅ ΞΊ β new (Ξ» Ξ± β assign Ξ± Ο΅ (ΞΊ Ξ±))
initial-store : π
initial-store = Ξ» Ξ± β Ξ· unallocated π-in-π
postulate finished : π
truish : π β π
truish =
Ξ» Ο΅ β (Ο΅ β-π) βΆ
(((Ο΅ |-π) ==α΅ Ξ· false) βΆ Ξ· false , Ξ· true) ,
Ξ· true
\end{code}
\clearpage
\begin{code}
cons : π
cons =
Ξ» Ο΅β ΞΊ β
(# Ο΅β ==β₯ 2) βΆ alloc (Ο΅β β 1) (Ξ» Ξ±β β
alloc (Ο΅β β 2) (Ξ» Ξ±β β
ΞΊ ((Ξ±β , Ξ±β) π-in-π))) ,
β₯
list : π
list = fix Ξ» listβ² β
Ξ» Ο΅β ΞΊ β
(# Ο΅β ==β₯ 0) βΆ ΞΊ (Ξ· null π-in-π) ,
listβ² (Ο΅β β 1) (Ξ» Ο΅ β cons β¨ (Ο΅β β 1) , Ο΅ β© ΞΊ)
car : π
car =
Ξ» Ο΅β ΞΊ β (# Ο΅β ==β₯ 1) βΆ hold ((Ο΅β β 1) |-π βΒ²1) ΞΊ , β₯
cdr : π
cdr =
Ξ» Ο΅β ΞΊ β (# Ο΅β ==β₯ 1) βΆ hold ((Ο΅β β 1) |-π βΒ²2) ΞΊ , β₯
setcar : π
setcar =
Ξ» Ο΅β ΞΊ β
(# Ο΅β ==β₯ 2) βΆ assign ((Ο΅β β 1) |-π βΒ²1)
(Ο΅β β 2)
(ΞΊ (Ξ· unspecified π-in-π)) ,
β₯
setcdr : π
setcdr =
Ξ» Ο΅β ΞΊ β
(# Ο΅β ==β₯ 2) βΆ assign ((Ο΅β β 1) |-π βΒ²2)
(Ο΅β β 2)
(ΞΊ (Ξ· unspecified π-in-π)) ,
β₯
\end{code}