\begin{code}
module Scheme.Auxiliary-Functions where
open import Scheme.Domain-Notation
open import Scheme.Domain-Equations
open import Scheme.Abstract-Syntax using (Ide)
open import Data.Nat.Base
using (NonZero; pred) public
postulate _==α΄΅_ : Ide β Ide β Bool
_[_/_] : π β π β Ide β π
Ο [ Ξ± / I ] = β
Ξ» Iβ² β if I ==α΄΅ Iβ² then Ξ± else β» Ο Iβ²
lookup : π β Ide β π
lookup = Ξ» Ο I β β» Ο I
extends : π β Ide ββ² β π β β π
extends = fix Ξ» extendsβ² β
Ξ» Ο Iββ² Ξ±β β
Ξ· (#β² Iββ² == 0) βΆ Ο ,
( ( ( (Ξ» I β Ξ» Iββ²β² β
extendsβ² (Ο [ (Ξ±β β 1) / I ]) Iββ²β² (Ξ±β β 1)) β―)
(Iββ² ββ² 1)) β―) (Iββ² β β² 1)
postulate
wrong : String β π
send : π β π β π
send = Ξ» Ο΅ ΞΊ β β» ΞΊ β¨ Ο΅ β©
single : (π β π) β π
single =
Ξ» Ο β β
Ξ» Ο΅β β
(# Ο΅β ==β₯ 1) βΆ Ο (Ο΅β β 1) ,
wrong "wrong number of return values"
postulate
new : π β π (π + π)
hold : π β π β π
hold = Ξ» Ξ± ΞΊ β β
Ξ» Ο β β» (send (β» Ο Ξ± β1) ΞΊ) Ο
postulate
_==α΄Έ_ : π β π β π
_[_/_]β² : π β (π Γ π) β π β π
Ο [ z / Ξ± ]β² = β
Ξ» Ξ±β² β (Ξ± ==α΄Έ Ξ±β²) βΆ z , β» Ο Ξ±β²
update : π β π β π β π
update = Ξ» Ξ± Ο΅ Ο β Ο [ (Ο΅ , Ξ· true) / Ξ± ]β²
assign : π β π β π β π
assign = Ξ» Ξ± Ο΅ ΞΈ β β
Ξ» Ο β β» ΞΈ (update Ξ± Ο΅ Ο)
tievals : (π β β π) β π β β π
tievals = fix Ξ» tievalsβ² β
Ξ» Ο Ο΅β β β
Ξ» Ο β
(# Ο΅β ==β₯ 0) βΆ β» (Ο β¨β©) Ο ,
((new Ο βπ) βΆ
β» (tievalsβ² (Ξ» Ξ±β β Ο (β¨ new Ο |π β© Β§ Ξ±β)) (Ο΅β β 1))
(update (new Ο |π) (Ο΅β β 1) Ο) ,
β» (wrong "out of memory") Ο )
list : π β β π β π
dropfirst : π β β π β π β
takefirst : π β β π β π β
tievalsrest : (π β β π) β π β β π β π
tievalsrest =
Ξ» Ο Ο΅β Ξ½ β list (dropfirst Ο΅β Ξ½)
(single (Ξ» Ο΅ β tievals Ο ((takefirst Ο΅β Ξ½) Β§ β¨ Ο΅ β©)))
dropfirst = fix Ξ» dropfirstβ² β
Ξ» Ο΅β Ξ½ β
(Ξ½ ==β₯ 0) βΆ Ο΅β ,
dropfirstβ² (Ο΅β β 1) (((Ξ· β pred) β―) Ξ½)
takefirst = fix Ξ» takefirstβ² β
Ξ» Ο΅β Ξ½ β
(Ξ½ ==β₯ 0) βΆ β¨β© ,
( β¨ Ο΅β β 1 β© Β§ (takefirstβ² (Ο΅β β 1) (((Ξ· β pred) β―) Ξ½)) )
truish : π β π
truish = Ξ» Ο΅ β (misc-false β―) (β» Ο΅) βΆ (Ξ· false) , (Ξ· true) where
misc-false : (π + π + π + ππ© + ππ― + ππ¬ + π + π
) β π Bool
misc-false (inj-π ΞΌ) = ((Ξ» { false β Ξ· true ; _ β Ξ· false }) β―) (ΞΌ)
misc-false (injβ _) = Ξ· false
misc-false (injβ _) = Ξ· false
misc-undefined : (π + π + π + ππ© + ππ― + ππ¬ + π + π
) β π Bool
misc-undefined (inj-π ΞΌ) = ((Ξ» { undefined β Ξ· true ; _ β Ξ· false }) β―) (ΞΌ)
misc-undefined (injβ _) = Ξ· false
misc-undefined (injβ _) = Ξ· false
applicate : π β π β β π β π
applicate =
Ξ» Ο΅ Ο΅β ΞΊ β
(Ο΅ βπ
) βΆ (β» (Ο΅ |π
) β2) Ο΅β ΞΊ ,
wrong "bad procedure"
onearg : (π β π β π) β (π β β π β π)
onearg =
Ξ» ΞΆ Ο΅β ΞΊ β
(# Ο΅β ==β₯ 1) βΆ ΞΆ (Ο΅β β 1) ΞΊ ,
wrong "wrong number of arguments"
twoarg : (π β π β π β π) β (π β β π β π)
twoarg =
Ξ» ΞΆ Ο΅β ΞΊ β
(# Ο΅β ==β₯ 2) βΆ ΞΆ (Ο΅β β 1) (Ο΅β β 2) ΞΊ ,
wrong "wrong number of arguments"
cons : π β β π β π
list = fix Ξ» listβ² β
Ξ» Ο΅β ΞΊ β
(# Ο΅β ==β₯ 0) βΆ send (β
(Ξ· (inj-π (Ξ· null)))) ΞΊ ,
listβ² (Ο΅β β 1) (single (Ξ» Ο΅ β cons β¨ (Ο΅β β 1) , Ο΅ β© ΞΊ))
cons = twoarg
Ξ» Ο΅β Ο΅β ΞΊ β β
Ξ» Ο β
(new Ο βπ) βΆ
(Ξ» Οβ² β (new Οβ² βπ) βΆ
β» (send ((new Ο |π , new Οβ² |π , (Ξ· true)) ππ©-in-π) ΞΊ)
(update (new Οβ² |π) Ο΅β Οβ²) ,
β» (wrong "out of memory") Οβ²)
(update (new Ο |π) Ο΅β Ο) ,
β» (wrong "out of memory") Ο
\end{code}