mirror of
https://github.com/ProgramSnail/pass_strategy_synthesis.git
synced 2026-04-26 16:24:50 +00:00
Compare commits
2 commits
adeefc1c87
...
0937d91f54
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0937d91f54 | ||
|
|
e786cc6135 |
1 changed files with 154 additions and 202 deletions
|
|
@ -24,8 +24,6 @@
|
|||
#let isPossibleWrite = `isPossibleWrite`
|
||||
#let isRef = `isRef`
|
||||
#let isCopy = `isCopy`
|
||||
#let isIn = `isIn`
|
||||
#let isOut = `isOut`
|
||||
|
||||
#let readTag = `read`
|
||||
#let writeTag = `write`
|
||||
|
|
@ -42,6 +40,9 @@
|
|||
#let In = `In`
|
||||
#let Out = `Out`
|
||||
|
||||
#let cl = $chevron.l$
|
||||
#let cr = $chevron.r$
|
||||
|
||||
#let expr = `expr`
|
||||
#let stmt = `stmt`
|
||||
#let decl = `decl`
|
||||
|
|
@ -56,9 +57,9 @@
|
|||
{ Or[Read][read passed value]
|
||||
Or[$not$ Read][] } ),
|
||||
Prod(`write`,
|
||||
{ Or[$square$ Write][in all cases there is a write to passed variable] // always write, requre at least one write in each flow variant
|
||||
Or[$diamond$ Write][in some cases there is a write to passed variable] // possible write, no requirements (?)
|
||||
Or[$not$ Write][] } ), // no write, require n owrites in all flow variants
|
||||
{ Or[$square$ Write][in all cases there is a write to the variable] // always write, requre at least one write in each flow variant
|
||||
Or[$diamond$ Write][in some cases there is a write to the variable] // possible write, no requirements (?)
|
||||
Or[$not$ Write][in none cases there is a write to the variable ] } ), // no write, require n owrites in all flow variants
|
||||
Prod(`copy`,
|
||||
{ Or[Ref][pass reference to the value]
|
||||
Or[Value][pass copy of the value] } ),
|
||||
|
|
@ -88,8 +89,8 @@
|
|||
Prod(
|
||||
`type`,
|
||||
{
|
||||
Or[$readTag writeTag ()$][simple type representing all primitive types] // `Unit`
|
||||
Or[$rf copyTag space type$][reference to structure, contains copy / ref choice] // `Ref`
|
||||
Or[$cl readTag, writeTag cr$][simple type representing all primitive types] // `Unit`
|
||||
Or[$rf copyTag type$][reference to structure, contains copy / ref choice] // `Ref`
|
||||
Or[$[type+]$][tuple type] // `Prod`
|
||||
// Or[`type` $times$ `type`][pair type, allows to make tuples] // `Prod`
|
||||
// Or[`type` $+$ `type`][union type (important in some way ???)] // `Sum` // TODO ?
|
||||
|
|
@ -152,7 +153,7 @@
|
|||
Or[$0$][valid value of simple type] // `Unit`
|
||||
Or[$\#$][valid or spoiled value of simple type] // `Unit`
|
||||
Or[$bot$][spoiled value of simple type] // `Unit`
|
||||
Or[$lambda type+ stmt$][function pointer value] // `Fun`
|
||||
Or[$lambda$][function pointer value] // `Fun`
|
||||
Or[$rf deepValue$][reference value, contains label of the value in the memory] // `Ref`
|
||||
Or[$[deepValue+]$][tuple value] // `Prod`
|
||||
}
|
||||
|
|
@ -163,9 +164,8 @@
|
|||
Or[$0$][valid value of simple type] // `Unit`
|
||||
Or[$\#$][valid or spoiled value of simple type] // `Unit`
|
||||
Or[$bot$][spoiled value of simple type] // `Unit`
|
||||
Or[$lambda type+ stmt$][function pointer value] // `Fun`
|
||||
// FIXME: embed mode into value for simplification ??
|
||||
Or[$rf copyTag LL$][reference value, contains label of the value in the memory] // `Ref`
|
||||
Or[$lambda$][function pointer value] // `Fun`
|
||||
Or[$rf LL$][reference value, contains label of the value in the memory] // `Ref`
|
||||
Or[$[value+]$][tuple value] // `Prod`
|
||||
}
|
||||
),
|
||||
|
|
@ -178,15 +178,12 @@
|
|||
$v in value$ - произвольное значение
|
||||
|
||||
Получение #deepValue по #value:
|
||||
- $rf c l xarrowSquiggly(mu)_#[deep] rf c mu[l]$
|
||||
- $rf l xarrowSquiggly(mu)_#[deep] rf mu[l]$
|
||||
- $* xarrowSquiggly(mu)_#[deep] *$
|
||||
где $*$ - произвольный конструктор значения, кроме $rf$
|
||||
|
||||
== Memory Model
|
||||
|
||||
#let cl = $chevron.l$
|
||||
#let cr = $chevron.r$
|
||||
|
||||
#let mem = `mem`
|
||||
|
||||
- $LL$ - множество меток памяти
|
||||
|
|
@ -219,8 +216,12 @@ $X$ - можество переменных
|
|||
#let pathenvmem = `pathenvmem`
|
||||
#let pathenvtype = `pathenvtype`
|
||||
|
||||
#let env = `env`
|
||||
$sigma : env := X -> LL times type, space sigma : env$ - #[ метки памяти и типы значений пеерменных контекста, частично определённая функция ]
|
||||
#let vals = $Sigma$
|
||||
#let types = $Gamma$
|
||||
#let envv = $#[env]_Sigma$
|
||||
#let envt = $#[env]_Gamma$
|
||||
$sigma : envv := X -> LL, space vals : envv$ - #[ метки памяти перменных контекста, частично определённая функция ]
|
||||
$sigma : envt := X -> type, space types : envt$ - #[ типы значений перменных контекста, частично определённая функция ]
|
||||
|
||||
// $DD : X -> decl$ - глобальные определения, частично определённая функция
|
||||
|
||||
|
|
@ -239,8 +240,9 @@ $s in stmt, f in X, x in X, a in X$
|
|||
#let eqmu = $attach(=, br: mu)$
|
||||
#let arrmu = $attach(->, br: mu)$
|
||||
|
||||
#let arrpath = $xarrowSquiggly(mu)_path$
|
||||
|
||||
#let ttype = $attach(tack.r, br: type)$
|
||||
#let tpath = $attach(tack.r, br: path)$
|
||||
#let tmode = $attach(tack.r, br: mode)$
|
||||
|
||||
#let val = `val`
|
||||
|
|
@ -248,22 +250,22 @@ $s in stmt, f in X, x in X, a in X$
|
|||
#let tval = $attach(tack.r, br: val)$
|
||||
#let tlabel = $attach(tack.r, br: label)$
|
||||
|
||||
#let tetype = $attach(tack.r.double, br: type)$
|
||||
#let temode = $attach(tack.r.double, br: mode)$
|
||||
// TODO: TMP, deprecated
|
||||
// #let tetype = $attach(tack.r.double, br: type)$
|
||||
// #let temode = $attach(tack.r.double, br: mode)$
|
||||
// #let telabel = $attach(tack.r.double, br: label)$
|
||||
|
||||
#let teval = $attach(tack.r.double, br: val)$
|
||||
#let telabel = $attach(tack.r.double, br: label)$
|
||||
|
||||
// TODO: env mem label ??, env mem value ??
|
||||
|
||||
// TODO: FIXME: backwards, deconstruction ??
|
||||
- #[ Конструирование путей по переменой
|
||||
#align(center, prooftree(
|
||||
vertical-spacing: 4pt,
|
||||
rule(
|
||||
name: [ variable path],
|
||||
|
||||
$x tpath @x$,
|
||||
$@x arrpath x$,
|
||||
)
|
||||
))
|
||||
#align(center, prooftree(
|
||||
|
|
@ -271,8 +273,8 @@ $s in stmt, f in X, x in X, a in X$
|
|||
rule(
|
||||
name: [ reference path],
|
||||
|
||||
$x tpath p$,
|
||||
$x tpath rf p$,
|
||||
$p arrpath x$,
|
||||
$rf p arrpath x$,
|
||||
)
|
||||
))
|
||||
#align(center, prooftree(
|
||||
|
|
@ -280,9 +282,9 @@ $s in stmt, f in X, x in X, a in X$
|
|||
rule(
|
||||
name: [ tuple access path],
|
||||
|
||||
$x tpath p$,
|
||||
$p arrpath x$,
|
||||
|
||||
$x tpath p.i$,
|
||||
$p.i arrpath x$,
|
||||
)
|
||||
))
|
||||
]
|
||||
|
|
@ -293,7 +295,8 @@ $s in stmt, f in X, x in X, a in X$
|
|||
rule(
|
||||
name: [ variable type access],
|
||||
|
||||
$x : t_x ttype @x : t_x$,
|
||||
$x : t_x in types$,
|
||||
$types ttype @x : t_x$,
|
||||
)
|
||||
))
|
||||
#align(center, prooftree(
|
||||
|
|
@ -301,9 +304,8 @@ $s in stmt, f in X, x in X, a in X$
|
|||
rule(
|
||||
name: [ reference type access],
|
||||
|
||||
$x tpath p$,
|
||||
$x : t_x ttype p : rf mode t_p$,
|
||||
$x : t_x ttype *p : t_p$,
|
||||
$types ttype p : rf mode t_p$,
|
||||
$types ttype *p : t_p$,
|
||||
)
|
||||
))
|
||||
#align(center, prooftree(
|
||||
|
|
@ -311,44 +313,24 @@ $s in stmt, f in X, x in X, a in X$
|
|||
rule(
|
||||
name: [ tuple type access],
|
||||
|
||||
$x tpath p$,
|
||||
$x : t_x ttype p : [t_1, ... t_n]$,
|
||||
$x : t_x ttype p.i : t_i$,
|
||||
$types ttype p : [t_1, ... t_n]$,
|
||||
$types ttype p.i : t_i$,
|
||||
)
|
||||
))
|
||||
]
|
||||
|
||||
- #[ Получение read-write тега поля
|
||||
#align(center, prooftree(
|
||||
vertical-spacing: 4pt,
|
||||
rule(
|
||||
name: [ variable rw tag access],
|
||||
// TODO: not required (trivial) ??
|
||||
// - #[ Получение read-write тега поля
|
||||
// #align(center, prooftree(
|
||||
// vertical-spacing: 4pt,
|
||||
// rule(
|
||||
// name: [ rw tag access],
|
||||
|
||||
$t_x = r w ()$,
|
||||
$x : t_x tmode @x -> cr r w cl$,
|
||||
)
|
||||
))
|
||||
#align(center, prooftree(
|
||||
vertical-spacing: 4pt,
|
||||
rule(
|
||||
name: [ reference rw tag access],
|
||||
|
||||
$x tpath p$,
|
||||
$x : t_x tmode p -> cr r w cl$,
|
||||
$x : t_x tmode *p -> cr r w cl$,
|
||||
)
|
||||
))
|
||||
#align(center, prooftree(
|
||||
vertical-spacing: 4pt,
|
||||
rule(
|
||||
name: [ tuple rw tag access],
|
||||
|
||||
$x tpath p$,
|
||||
$x : t_x tmode p -> cr r w cl$,
|
||||
$x : t_x tmode p.i -> cr r w cl$,
|
||||
)
|
||||
))
|
||||
]
|
||||
// $types ttype p : cl r, w cr$,
|
||||
// $types tmode p -> cl r, w cr$,
|
||||
// )
|
||||
// ))
|
||||
// ]
|
||||
|
||||
- #[ Получение значения поля
|
||||
#align(center, prooftree(
|
||||
|
|
@ -356,7 +338,9 @@ $s in stmt, f in X, x in X, a in X$
|
|||
rule(
|
||||
name: [ variable value access],
|
||||
|
||||
$x eqmu v_x tval @x eqmu v_x$,
|
||||
$x -> l in vals$,
|
||||
$mu[l] = v$,
|
||||
$vals, mu tval x eqmu v$,
|
||||
)
|
||||
))
|
||||
#align(center, prooftree(
|
||||
|
|
@ -364,9 +348,8 @@ $s in stmt, f in X, x in X, a in X$
|
|||
rule(
|
||||
name: [ reference value access],
|
||||
|
||||
$x tpath p$,
|
||||
$x eqmu v_x tval p eqmu rf l$,
|
||||
$x eqmu v_x tval *p eqmu mu[l]$,
|
||||
$vals, mu tval p eqmu rf l$,
|
||||
$vals, mu tval *p eqmu mu[l]$,
|
||||
)
|
||||
))
|
||||
#align(center, prooftree(
|
||||
|
|
@ -374,52 +357,37 @@ $s in stmt, f in X, x in X, a in X$
|
|||
rule(
|
||||
name: [ tuple value access],
|
||||
|
||||
$x tpath p$,
|
||||
$x eqmu v_x tmode p eqmu [v_1, ... v_n]$,
|
||||
$x eqmu v_x tmode p.i eqmu v_i$,
|
||||
$vals, mu tval p eqmu [v_1, ... v_n]$,
|
||||
$vals, mu tval p.i eqmu v_i$,
|
||||
)
|
||||
))
|
||||
]
|
||||
|
||||
- #[ Получение метки поля
|
||||
#align(center, prooftree(
|
||||
vertical-spacing: 4pt,
|
||||
rule(
|
||||
name: [ access],
|
||||
// TODO: FIXME: not required (trivial) ??
|
||||
// - #[ Получение метки поля
|
||||
// #align(center, prooftree(
|
||||
// vertical-spacing: 4pt,
|
||||
// rule(
|
||||
// name: [ access],
|
||||
|
||||
$v_x = rf l$,
|
||||
$x eqmu v_x tval p eqmu rf l$,
|
||||
// $vals, mu tval p eqmu rf l$,
|
||||
// $vals, mu tmode p arrmu l$,
|
||||
// )
|
||||
// ))
|
||||
// ]
|
||||
|
||||
$x eqmu v_x tmode p arrmu l$,
|
||||
)
|
||||
))
|
||||
]
|
||||
// TODO: not required (trivial) ??
|
||||
// - #[ Получение read-write тега поля по окружению
|
||||
// #align(center, prooftree(
|
||||
// vertical-spacing: 4pt,
|
||||
// rule(
|
||||
// name: [ access],
|
||||
|
||||
- #[ Получение типа поля по окружению
|
||||
#align(center, prooftree(
|
||||
vertical-spacing: 4pt,
|
||||
rule(
|
||||
name: [ access],
|
||||
|
||||
$x tpath p$,
|
||||
$x : sigma[x].2 ttype p : t$,
|
||||
$sigma tetype p : t$,
|
||||
)
|
||||
))
|
||||
]
|
||||
|
||||
- #[ Получение read-write тега поля по окружению
|
||||
#align(center, prooftree(
|
||||
vertical-spacing: 4pt,
|
||||
rule(
|
||||
name: [ access],
|
||||
|
||||
$x tpath p$,
|
||||
$x : sigma[x].2 tmode p -> cr r space w cl$,
|
||||
$sigma temode p -> cr r space w cl$,
|
||||
)
|
||||
))
|
||||
]
|
||||
// $x : types[x] tmode p -> cr r space w cl$,
|
||||
// $sigma temode p -> cr r space w cl$,
|
||||
// )
|
||||
// ))
|
||||
// ]
|
||||
|
||||
- #[ Получение значения поля по окружению
|
||||
#align(center, prooftree(
|
||||
|
|
@ -427,33 +395,12 @@ $s in stmt, f in X, x in X, a in X$
|
|||
rule(
|
||||
name: [ access],
|
||||
|
||||
$x tpath p$,
|
||||
$x eqmu sigma[x].1 tval p eqmu v$,
|
||||
$sigma, mu teval p eqmu x$,
|
||||
$x eqmu vals[x] tval p eqmu v$,
|
||||
$types, vals, mu teval p eqmu x$,
|
||||
)
|
||||
))
|
||||
]
|
||||
|
||||
- #[ Получение метки поля по окружению
|
||||
#align(center, prooftree(
|
||||
vertical-spacing: 4pt,
|
||||
rule(
|
||||
name: [ access],
|
||||
|
||||
$x tpath p$,
|
||||
$x eqmu sigma[x].1 tlabel p arrmu l$,
|
||||
$sigma, mu telabel p arrmu l$,
|
||||
)
|
||||
))
|
||||
]
|
||||
|
||||
=== Mode Accessors
|
||||
|
||||
#let modevar = $(i space o)$
|
||||
|
||||
$ isIn modevar = i == In $
|
||||
$ isOut modevar = o == Out $
|
||||
|
||||
// FIXME: move to new mode model
|
||||
// === Mode Correctness
|
||||
|
||||
|
|
@ -510,58 +457,29 @@ $ isOut modevar = o == Out $
|
|||
// TODO: FIXME: check for mode, is recursion required ??
|
||||
// TODO: FIXME: check mode & access corectness in os correct
|
||||
|
||||
$ sigma in env, space mu in mem, space m in mode,
|
||||
$ vals in envv, types in envt, space mu in mem, space m in mode,
|
||||
space c in copyTag, space r, r' in readTag, space w, w' in writeTag,
|
||||
space v in value, space t, t' in type $
|
||||
|
||||
#h(10pt)
|
||||
|
||||
// TODO: FIXME: complete rule check
|
||||
// + add part about ref -> not copy later
|
||||
#align(center, prooftree(
|
||||
vertical-spacing: 4pt,
|
||||
rule(
|
||||
name: [ unit assignment tags correctness],
|
||||
|
||||
$r = Read => isIn m$,
|
||||
$isOut m => w = AlwaysWrite$,
|
||||
$r = Read => m = (In, \_)$,
|
||||
$m = (\_, Out) => w = AlwaysWrite$,
|
||||
// $sigma temode x -> cr r' space w' cl$, // NOTE: not required, value passed
|
||||
$(w = AlwaysWrite or w = MaybeWrite) and (isOut m or c = Ref) => w' = AlwaysWrite$,
|
||||
$(w = AlwaysWrite or w = MaybeWrite) and (m = (\_, Out) or c = Ref) => w' = AlwaysWrite$,
|
||||
|
||||
// $sigma, mu teval x eqmu v$, // NOTE: not required, value passed
|
||||
$v in {0, \#, bot}$,
|
||||
$r = Read => v = 0$,
|
||||
|
||||
$sigma, mu, m, c tcorrect v : r' space w' () -> r space w ()$,
|
||||
)
|
||||
))
|
||||
|
||||
#h(10pt)
|
||||
|
||||
#align(center, prooftree(
|
||||
vertical-spacing: 4pt,
|
||||
rule(
|
||||
name: [ ref assignment tags correctness],
|
||||
|
||||
$sigma, mu, m, c_r tcorrect v : t -> t'$,
|
||||
|
||||
// TODO: FIXME: which tag translations are correct ?? <- only assignee?
|
||||
$sigma, mu, m, c tcorrect rf c_r space v : rf c' space t -> rf c_r space t'$,
|
||||
)
|
||||
))
|
||||
|
||||
#h(10pt)
|
||||
|
||||
#align(center, prooftree(
|
||||
vertical-spacing: 4pt,
|
||||
rule(
|
||||
name: [ tuple assignmenttags correctness],
|
||||
|
||||
$sigma, mu, m, c tcorrect v_1 : t_1 -> t'_1$,
|
||||
|
||||
$...$,
|
||||
|
||||
$sigma, mu, m, c tcorrect v_n : t_n -> t'_n$,
|
||||
|
||||
$sigma, mu, m, c tcorrect [v_1, ... v_n] : [t_1, ..., t_n] -> [t'_1, t'_n]$,
|
||||
$types, vals, mu, m, c tcorrect v : cl r', w' cr -> cl r, w cr$,
|
||||
)
|
||||
))
|
||||
|
||||
|
|
@ -572,7 +490,38 @@ $ sigma in env, space mu in mem, space m in mode,
|
|||
rule(
|
||||
name: [ function pointer tags correctness],
|
||||
|
||||
$sigma, mu, m, c tcorrect lambda space overline(t) space s : lambda space overline(t) -> lambda space overline(t)$,
|
||||
$types, vals, mu, m, c tcorrect lambda : lambda space overline(t) -> lambda space overline(t)$,
|
||||
)
|
||||
))
|
||||
|
||||
#h(10pt)
|
||||
|
||||
#align(center, prooftree(
|
||||
vertical-spacing: 4pt,
|
||||
rule(
|
||||
name: [ ref assignment tags correctness],
|
||||
|
||||
$types, vals, mu, m, c_r tcorrect v : t -> t'$,
|
||||
|
||||
// TODO: FIXME: which tag translations are correct ?? <- only assignee?
|
||||
$types, vals, mu, m, c tcorrect rf space v : rf c' space t -> rf c_r space t'$,
|
||||
)
|
||||
))
|
||||
|
||||
#h(10pt)
|
||||
|
||||
#align(center, prooftree(
|
||||
vertical-spacing: 4pt,
|
||||
rule(
|
||||
name: [ tuple assignmenttags correctness],
|
||||
|
||||
$types, vals, mu, m, c tcorrect v_1 : t_1 -> t'_1$,
|
||||
|
||||
$...$,
|
||||
|
||||
$types, vals, mu, m, c tcorrect v_n : t_n -> t'_n$,
|
||||
|
||||
$types, vals, mu, m, c tcorrect [v_1, ... v_n] : [t_1, ..., t_n] -> [t'_1, ... t'_n]$,
|
||||
)
|
||||
))
|
||||
|
||||
|
|
@ -580,6 +529,8 @@ $ sigma in env, space mu in mem, space m in mode,
|
|||
|
||||
=== Value Construction
|
||||
|
||||
// TODO: FIXME:add ref / copy modes correctness check
|
||||
|
||||
#let new = `new`
|
||||
|
||||
#align(center, prooftree(
|
||||
|
|
@ -588,7 +539,7 @@ $ sigma in env, space mu in mem, space m in mode,
|
|||
name: [ new $0$ value],
|
||||
|
||||
// TODO: check that access is what required ??
|
||||
$cl 0, mu cr xarrowSquiggly(space)_new cl 0, mu cr$,
|
||||
$cl 0, mu cr xarrowSquiggly(cl r\, w cr)_new cl 0, mu cr$,
|
||||
)
|
||||
))
|
||||
|
||||
|
|
@ -598,7 +549,7 @@ $ sigma in env, space mu in mem, space m in mode,
|
|||
name: [ new $\#$ value],
|
||||
|
||||
// TODO: check that access is what required ??
|
||||
$cl \#, mu cr xarrowSquiggly(space)_new cl \#, mu cr$,
|
||||
$cl \#, mu cr xarrowSquiggly(cl r\, w cr)_new cl \#, mu cr$,
|
||||
)
|
||||
))
|
||||
|
||||
|
|
@ -607,7 +558,7 @@ $ sigma in env, space mu in mem, space m in mode,
|
|||
rule(
|
||||
name: [ new $bot$ value],
|
||||
|
||||
$cl bot, mu cr xarrowSquiggly(space)_new cl bot, mu cr$,
|
||||
$cl bot, mu cr xarrowSquiggly(cl r\, w cr)_new cl bot, mu cr$,
|
||||
)
|
||||
))
|
||||
|
||||
|
|
@ -625,7 +576,10 @@ $ sigma in env, space mu in mem, space m in mode,
|
|||
rule(
|
||||
name: [ new reference ref value],
|
||||
|
||||
$cl rf Ref l, mu cr xarrowSquiggly(space)_new cl rf Ref l, mu cr$,
|
||||
// TODO: FIXME: recursive copy ?? (what heppens if ref field has copy substructure ??)
|
||||
// frbidden ??
|
||||
|
||||
$cl rf l, mu cr xarrowSquiggly(rf Ref t)_new cl rf l, mu cr$,
|
||||
)
|
||||
))
|
||||
|
||||
|
|
@ -634,11 +588,11 @@ $ sigma in env, space mu in mem, space m in mode,
|
|||
rule(
|
||||
name: [ new reference copy value],
|
||||
|
||||
$cl mu[l], mu cr xarrowSquiggly(space)_new cl v, mu_v cr$,
|
||||
$cl mu[l], mu cr xarrowSquiggly(t)_new cl v, mu_v cr$,
|
||||
|
||||
$cl mu_v cr xarrowSquiggly(v)_#[add] cl l', mu_a cr$,
|
||||
|
||||
$cl rf Copy l, mu cr xarrowSquiggly(space)_new cl rf Copy l', mu_a cr$,
|
||||
$cl rf l, mu cr xarrowSquiggly(rf Copy t)_new cl rf l', mu_a cr$,
|
||||
)
|
||||
))
|
||||
|
||||
|
|
@ -647,11 +601,11 @@ $ sigma in env, space mu in mem, space m in mode,
|
|||
rule(
|
||||
name: [ new tuple value],
|
||||
|
||||
$cl v_1, mu_0 cr xarrowSquiggly(space)_new cl lambda v'_1, mu_1 cr$,
|
||||
$cl v_1, mu_0 cr xarrowSquiggly(t_1)_new cl lambda v'_1, mu_1 cr$,
|
||||
$...$,
|
||||
$cl v_n, mu_(n - 1) cr xarrowSquiggly(space)_new cl lambda v'_n, mu_n cr$,
|
||||
$cl v_n, mu_(n - 1) cr xarrowSquiggly(t_n)_new cl lambda v'_n, mu_n cr$,
|
||||
|
||||
$cl [v_1, ... v_n], mu_0 cr xarrowSquiggly(space)_new cl [v'_1, ... v'_n], mu_n cr$,
|
||||
$cl [v_1, ... v_n], mu_0 cr xarrowSquiggly([t_1, ... t_n])_new cl [v'_1, ... v'_n], mu_n cr$,
|
||||
)
|
||||
))
|
||||
|
||||
|
|
@ -685,7 +639,7 @@ $ sigma in env, space mu in mem, space m in mode,
|
|||
|
||||
$isPossibleWrite mode$, // NOTE: weak requirement: may write
|
||||
$not isCopy mode$,
|
||||
$not isOut mode$,
|
||||
$mode = (\_, not Out)$,
|
||||
|
||||
$isCorrect_(cl sigma, mu cr) (mode, x)$,
|
||||
|
||||
|
|
@ -704,7 +658,7 @@ $ sigma in env, space mu in mem, space m in mode,
|
|||
$mu stretch(=>)^args_sigma gamma$,
|
||||
|
||||
$isAlwaysWrite mode$, // NOTE: strong requirement: should write
|
||||
$isOut mode$,
|
||||
$mode = (\_, not Out)$,
|
||||
|
||||
$isCorrect_(cl sigma, mu cr) (mode, x)$,
|
||||
|
||||
|
|
@ -816,11 +770,11 @@ $ sigma in env, space mu in mem, space m in mode,
|
|||
rule(
|
||||
name: [ READ $p$],
|
||||
|
||||
$mu, sigma teval p eqmu 0$,
|
||||
$mu, types, vals teval p eqmu 0$,
|
||||
|
||||
$cl sigma, mu, l cr
|
||||
$cl types, vals, mu cr
|
||||
xarrow("READ" p)
|
||||
cl sigma, mu, l cr$,
|
||||
cl types, vals, mu cr$,
|
||||
)
|
||||
))
|
||||
|
||||
|
|
@ -831,17 +785,14 @@ $ sigma in env, space mu in mem, space m in mode,
|
|||
rule(
|
||||
name: [ WRITE $x$],
|
||||
|
||||
$sigma temode p -> cr r space w cl$,
|
||||
|
||||
$w == MaybeWrite or w == AlwaysWrite$,
|
||||
|
||||
$x tpath p$,
|
||||
|
||||
$types ttype p : cl r, w cr$,
|
||||
$w = MaybeWrite or w = AlwaysWrite$,
|
||||
$p arrpath x$,
|
||||
$mu[x] xarrowSquiggly(p)_write v$,
|
||||
|
||||
$cl sigma, mu cr
|
||||
$cl types, vals, mu cr
|
||||
xarrow("WRITE" p)
|
||||
cl sigma, mu[x <- v] cr$,
|
||||
cl types, vals, mu[x <- v] cr$,
|
||||
)
|
||||
))
|
||||
|
||||
|
|
@ -852,17 +803,17 @@ $ sigma in env, space mu in mem, space m in mode,
|
|||
rule(
|
||||
name: [ $s \; t$],
|
||||
|
||||
$cl sigma, mu cr
|
||||
$cl types, vals, mu cr
|
||||
stretch(->)^s
|
||||
cl sigma_s, mu_s cr$,
|
||||
cl types_s, vals_s, mu_s cr$,
|
||||
|
||||
$cl sigma, mu cr
|
||||
$cl types_s, vals_s, mu_s cr
|
||||
stretch(->)^t
|
||||
cl sigma_t, mu_t cr$,
|
||||
cl types_t, vals_t, mu_t cr$,
|
||||
|
||||
$cl sigma, mu, cr
|
||||
$cl types, vals, mu, cr
|
||||
xarrow(s \; t)
|
||||
cl sigma_t, mu_t cr$,
|
||||
cl types_t, vals_t, mu_t cr$,
|
||||
)
|
||||
))
|
||||
|
||||
|
|
@ -876,21 +827,22 @@ $ sigma in env, space mu in mem, space m in mode,
|
|||
rule(
|
||||
name: [ $s | t$],
|
||||
|
||||
$cl sigma, mu, l cr
|
||||
$cl types, vals, mu cr
|
||||
stretch(->)^s
|
||||
cl sigma_s, mu_s, l_s cr$,
|
||||
cl types_s, vals_s, mu_s cr$,
|
||||
|
||||
$cl sigma, mu, l cr
|
||||
$cl types, vals, mu cr
|
||||
stretch(->)^t
|
||||
cl sigma_t, mu_t, l_t cr$,
|
||||
cl types_t, vals_t, mu_t cr$,
|
||||
|
||||
$sigma_s = sigma_t$,
|
||||
$types_s = types_t$,
|
||||
$vals_s = vals_t$,
|
||||
$mu' = combine(mu_s, mu_t)$,
|
||||
|
||||
// TODO changes ?? two ways ??
|
||||
$cl sigma, mu cr
|
||||
$cl types, vals, mu cr
|
||||
xarrow(s | t)
|
||||
cl sigma_t, mu' cr$,
|
||||
cl types_t, vals_t, mu' cr$,
|
||||
)
|
||||
))
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue