struct: model update to use reverse paths in valupd (fix)

This commit is contained in:
ProgramSnail 2026-05-10 16:56:42 +00:00
parent 855a3d1ef9
commit 62e6a55810

View file

@ -153,6 +153,7 @@
#let deepValue = `deepvalue` #let deepValue = `deepvalue`
#let value = `value` #let value = `value`
#let revpath = $#[`path`]_#[`rev`]$
#bnf( #bnf(
Prod( Prod(
@ -177,12 +178,22 @@
Or[$[value+]$][tuple value] // `Prod` Or[$[value+]$][tuple value] // `Prod`
} }
), ),
Prod(
revpath,
{
Or[$\# .$][value by itself]
Or[$rf revpath$][reference to value]
Or[$n . revpath$][tuple with value as $n$-th element]
}
),
) )
#deepValue - полное значение, #value - слой значения, привязан к конкретной памяти $mu$ #deepValue - полное значение, #value - слой значения, привязан к конкретной памяти $mu$
Значения, могут лежать в переменных и передаваться как аргументы функций (то, во что вычисляется $expr$) Значения, могут лежать в переменных и передаваться как аргументы функций (то, во что вычисляется $expr$)
$revpath$ - путь в обратную сторону, используется для обновления значений
$v in value$ - произвольное значение $v in value$ - произвольное значение
Получение #deepValue по #value: Получение #deepValue по #value:
@ -229,7 +240,7 @@ $sigma : envt := X -> type, space types : envt$ - #[ типы значений
// $DD : X -> decl$ - глобальные определения, частично определённая функция // $DD : X -> decl$ - глобальные определения, частично определённая функция
// $d in decl, $ // $d in decl, $
$s in stmt, f in X, x in X, a in X$ $s in stmt, f in X, x in X, a in X, p in path, pi in revpath$
=== Path Accessors === Path Accessors
@ -241,6 +252,7 @@ $s in stmt, f in X, x in X, a in X$
#let arrmu = $attach(->, br: mu)$ #let arrmu = $attach(->, br: mu)$
#let arrpath = $xarrowSquiggly(space)_path$ #let arrpath = $xarrowSquiggly(space)_path$
#let arrrevpath = $xarrowSquiggly(space)_#[rev path]$
#let ttype = $attach(tack.r, br: type)$ #let ttype = $attach(tack.r, br: type)$
#let tmode = $attach(tack.r, br: mode)$ #let tmode = $attach(tack.r, br: mode)$
@ -248,7 +260,7 @@ $s in stmt, f in X, x in X, a in X$
#let val = `val` #let val = `val`
#let tval = $attach(tack.r, br: val)$ #let tval = $attach(tack.r, br: val)$
- #[ Конструирование путей по переменой - #[ Соответствующая пути переменная
#align(center, prooftree( #align(center, prooftree(
vertical-spacing: 4pt, vertical-spacing: 4pt,
rule( rule(
@ -263,7 +275,7 @@ $s in stmt, f in X, x in X, a in X$
name: [ reference path], name: [ reference path],
$p arrpath x$, $p arrpath x$,
$rf p arrpath x$, $* p arrpath x$,
) )
)) ))
#align(center, prooftree( #align(center, prooftree(
@ -278,6 +290,36 @@ $s in stmt, f in X, x in X, a in X$
)) ))
] ]
- #[ Обращение пути
#align(center, prooftree(
vertical-spacing: 4pt,
rule(
name: [ variable path],
$@x arrrevpath^pi pi$,
)
))
#align(center, prooftree(
vertical-spacing: 4pt,
rule(
name: [ reference path],
$p arrrevpath^(rf pi) pi'$,
$*p arrrevpath^pi pi'$,
)
))
#align(center, prooftree(
vertical-spacing: 4pt,
rule(
name: [ tuple access path],
$p arrrevpath^(i.pi) pi'$,
$p.i arrrevpath^pi pi'$,
)
))
]
- #[ Получение типа поля - #[ Получение типа поля
#align(center, prooftree( #align(center, prooftree(
vertical-spacing: 4pt, vertical-spacing: 4pt,
@ -509,16 +551,6 @@ $s in stmt, f in X, x in X, a in X$
#let modify = `modify` #let modify = `modify`
// #align(center, prooftree(
// vertical-spacing: 4pt,
// rule(
// name: [ modify trivial value],
// $v in {0, \#, bot}$,
// $cl v, mu cr xarrowSquiggly(cl \@ x \, b cr)_modify cl b, mu cr$,
// )
// ))
// TODO: add type check ?? // TODO: add type check ??
#align(center, prooftree( #align(center, prooftree(
vertical-spacing: 4pt, vertical-spacing: 4pt,
@ -526,7 +558,7 @@ $s in stmt, f in X, x in X, a in X$
name: [ modify end value], name: [ modify end value],
// $v in {0, \#, bot}$, // $v in {0, \#, bot}$,
$cl v, mu cr xarrowSquiggly(cl \@ x \, b cr)_modify cl b, mu cr$, $cl v, mu cr xarrowSquiggly(cl \# . \, b cr)_modify cl b, mu cr$,
) )
)) ))
@ -537,8 +569,8 @@ $s in stmt, f in X, x in X, a in X$
rule( rule(
name: [ new reference copy value], name: [ new reference copy value],
$cl mu[l], mu cr xarrowSquiggly(cl p \, b cr)_modify cl v', mu' cr$, $cl mu[l], mu cr xarrowSquiggly(cl pi \, b cr)_modify cl v', mu' cr$,
$cl rf l, mu cr xarrowSquiggly(cl *p \, b cr)_modify cl rf l, mu'[l <- v'] cr$, $cl rf l, mu cr xarrowSquiggly(cl rf pi \, b cr)_modify cl rf l, mu'[l <- v'] cr$,
) )
)) ))
@ -550,7 +582,7 @@ $s in stmt, f in X, x in X, a in X$
name: [ modify tuple value], name: [ modify tuple value],
$cl v_i, mu cr xarrowSquiggly(cl p \, b cr)_modify cl v'_i, mu', cr$, $cl v_i, mu cr xarrowSquiggly(cl p \, b cr)_modify cl v'_i, mu', cr$,
$cl [v_1, ... v_i, ... v_n], mu cr xarrowSquiggly(cl p.i \, b cr)_modify cl [v_1, ... v'_i, ... v_n], mu' cr$, $cl [v_1, ... v_i, ... v_n], mu cr xarrowSquiggly(cl i.pi \, b cr)_modify cl [v_1, ... v'_i, ... v_n], mu' cr$,
) )
)) ))
@ -912,7 +944,8 @@ $s in stmt, f in X, x in X, a in X$
// <- otherwise all subsequent copy capabilities will be ref (in current impl) // <- otherwise all subsequent copy capabilities will be ref (in current impl)
// FIXME depends on parent ?? // FIXME depends on parent ??
$cl b, mu cr xarrowSquiggly(t \, t' \, m \, Copy)_spoil cl b', mu' cr$, $cl b, mu cr xarrowSquiggly(t \, t' \, m \, Copy)_spoil cl b', mu' cr$,
$cl mu'[l], mu' cr xarrowSquiggly(cl p \, b' cr)_modify cl v'', mu'' cr$, $p arrrevpath^(\#.) pi$,
$cl mu'[l], mu' cr xarrowSquiggly(cl pi \, b' cr)_modify cl v'', mu'' cr$,
$mu stretch(=>)^(m space t space p)_(cl vals, types cr) mu''[l <- v'']$, $mu stretch(=>)^(m space t space p)_(cl vals, types cr) mu''[l <- v'']$,
) )
@ -1055,7 +1088,8 @@ $s in stmt, f in X, x in X, a in X$
$w = MaybeWrite or w = AlwaysWrite$, $w = MaybeWrite or w = AlwaysWrite$,
$p arrpath x$, $p arrpath x$,
$l = vals[x]$, $l = vals[x]$,
$mu[l] xarrowSquiggly(cl p \, 0 cr)_modify v'$, $p arrrevpath^(\#.) pi$,
$mu[l] xarrowSquiggly(cl pi \, 0 cr)_modify v'$,
$cl types, vals, mu cr $cl types, vals, mu cr
xarrow("WRITE" p) xarrow("WRITE" p)