2022-02-10 07:14:29 +08:00
|
|
|
module Luau.Substitution where
|
|
|
|
|
2022-02-12 09:03:26 +08:00
|
|
|
open import Luau.Syntax using (Expr; Stat; Block; nil; addr; var; function_is_end; _$_; block_is_end; local_←_; _∙_; done; return; _⟨_⟩ ; name; fun; arg)
|
2022-02-10 07:14:29 +08:00
|
|
|
open import Luau.Value using (Value; val)
|
|
|
|
open import Luau.Var using (Var; _≡ⱽ_)
|
|
|
|
open import Properties.Dec using (Dec; yes; no)
|
|
|
|
|
2022-02-12 09:03:26 +08:00
|
|
|
_[_/_]ᴱ : ∀ {a} → Expr a → Value → Var → Expr a
|
|
|
|
_[_/_]ᴮ : ∀ {a} → Block a → Value → Var → Block a
|
|
|
|
var_[_/_]ᴱwhenever_ : ∀ {a P} → Var → Value → Var → (Dec P) → Expr a
|
|
|
|
_[_/_]ᴮunless_ : ∀ {a P} → Block a → Value → Var → (Dec P) → Block a
|
2022-02-10 07:14:29 +08:00
|
|
|
|
|
|
|
nil [ v / x ]ᴱ = nil
|
|
|
|
var y [ v / x ]ᴱ = var y [ v / x ]ᴱwhenever (x ≡ⱽ y)
|
|
|
|
addr a [ v / x ]ᴱ = addr a
|
|
|
|
(M $ N) [ v / x ]ᴱ = (M [ v / x ]ᴱ) $ (N [ v / x ]ᴱ)
|
2022-02-12 09:03:26 +08:00
|
|
|
function F is C end [ v / x ]ᴱ = function F is C [ v / x ]ᴮunless (x ≡ⱽ name(arg F)) end
|
2022-02-10 07:14:29 +08:00
|
|
|
block b is C end [ v / x ]ᴱ = block b is C [ v / x ]ᴮ end
|
|
|
|
|
2022-02-12 09:03:26 +08:00
|
|
|
(function F is C end ∙ B) [ v / x ]ᴮ = function F is (C [ v / x ]ᴮunless (x ≡ⱽ name(arg F))) end ∙ (B [ v / x ]ᴮunless (x ≡ⱽ fun F))
|
|
|
|
(local y ← M ∙ B) [ v / x ]ᴮ = local y ← (M [ v / x ]ᴱ) ∙ (B [ v / x ]ᴮunless (x ≡ⱽ name y))
|
2022-02-10 07:14:29 +08:00
|
|
|
(return M ∙ B) [ v / x ]ᴮ = return (M [ v / x ]ᴱ) ∙ (B [ v / x ]ᴮ)
|
|
|
|
done [ v / x ]ᴮ = done
|
|
|
|
|
|
|
|
var y [ v / x ]ᴱwhenever yes p = val v
|
|
|
|
var y [ v / x ]ᴱwhenever no p = var y
|
|
|
|
|
|
|
|
B [ v / x ]ᴮunless yes p = B
|
|
|
|
B [ v / x ]ᴮunless no p = B [ v / x ]ᴮ
|
|
|
|
|