import Base import ../../lib/logic.bend as L import ../../../spec/containers/balanced_search_tree/main.bend as S import ../../../src/containers/balanced_search_tree.bend as M import ./state.bend as ST import ./mirror.bend as MI import ./ok.bend as OK # A view's model and invariant, and the refinement of view results. # (source: tools/generators/tm_hand/vdef.src) # ---- a view's model and invariant ---- def vmod(~K: Data, ~V: Data, ~cmp: K -> K -> Cmp, w: MI.MView) -> S.View: match w: case MI.MV{s, lo2, hi2, d2}: S.VW{ST.model(~K, ~V, ~cmp, s), lo2, hi2, d2} def vgood(~K: Data, ~V: Data, ~cmp: K -> K -> Cmp, w: MI.MView) -> Bool: match w: case MI.MV{s, lo2, hi2, d2}: ST.good(~K, ~V, ~cmp, s) def vg_dg(~K: Data, ~V: Data, ~cmp: K -> K -> Cmp, +w: MI.MView, +h: {vgood(~K, ~V, ~cmp, w) == True{} : Bool}) -> {MI.dgv(K, V, w) == True{} : Bool}: match w: case MI.MV{+s, +lo2, +hi2, +d2}: OK.dg_good(~K, ~V, ~cmp, s, h) # a view refining a specification's def VOK(~K: Data, ~V: Data, ~cmp: K -> K -> Cmp, sp: S.View, r: M.View) -> Type: Sigma<&1, &1, MI.MView, w2 => {r == MI.rv(~K, ~V, ~cmp, w2) : M.View} & ({sp == vmod(~K, ~V, ~cmp, w2) : S.View} & {vgood(~K, ~V, ~cmp, w2) == True{} : Bool})> # a mirror view result refining a specification's def VM(~K: Data, ~V: Data, ~cmp: K -> K -> Cmp, -X: Data, sp: S.View & X, mir: MI.MView & X) -> Type: Sigma<&1, &1, MI.MView, w2 => Sigma<&1, &1, X, o => {MI.rvp(~K, ~V, ~cmp, X, mir) == (MI.rv(~K, ~V, ~cmp, w2), o) : M.View & X} & ({sp == (vmod(~K, ~V, ~cmp, w2), o) : S.View & X} & {vgood(~K, ~V, ~cmp, w2) == True{} : Bool})>> # an implementation view result refining a specification's def VPOK(~K: Data, ~V: Data, ~cmp: K -> K -> Cmp, -X: Data, sp: S.View & X, r: M.View & X) -> Type: Sigma<&1, &1, MI.MView, w2 => Sigma<&1, &1, X, o => {r == (MI.rv(~K, ~V, ~cmp, w2), o) : M.View & X} & ({sp == (vmod(~K, ~V, ~cmp, w2), o) : S.View & X} & {vgood(~K, ~V, ~cmp, w2) == True{} : Bool})>> def vm_pok(~K: Data, ~V: Data, ~cmp: K -> K -> Cmp, -X: Data, -sp: S.View & X, -mir: MI.MView & X, -r: M.View & X, +hs: {r == MI.rvp(~K, ~V, ~cmp, X, mir) : M.View & X}, p: VM(~K, ~V, ~cmp, X, sp, mir)) -> VPOK(~K, ~V, ~cmp, X, sp, r): match p: case Tuple{+w2, Tuple{+o, Tuple{+h1, rest}}}: (w2, (o, (Equal.trans(M.View & X, r, MI.rvp(~K, ~V, ~cmp, X, mir), (MI.rv(~K, ~V, ~cmp, w2), o), hs, h1), rest))) # a mirror result given exactly def vm_exact(~K: Data, ~V: Data, ~cmp: K -> K -> Cmp, -X: Data, -sp: S.View & X, -mir: MI.MView & X, +w2: MI.MView, +o: X, +hm: {mir == (w2, o) : MI.MView & X}, +hs: {sp == (vmod(~K, ~V, ~cmp, w2), o) : S.View & X}, +hg: {vgood(~K, ~V, ~cmp, w2) == True{} : Bool}) -> VM(~K, ~V, ~cmp, X, sp, mir): (w2, (o, (L.subst(MI.MView & X, z => {MI.rvp(~K, ~V, ~cmp, X, z) == (MI.rv(~K, ~V, ~cmp, w2), o) : M.View & X}, (w2, o), mir, Equal.sym(MI.MView & X, mir, (w2, o), hm), {==}), (hs, hg))))