def gen_cell.go

minebender-game@1.0.0.0 · proof_gen.bend:414

import minebender-game@1.0.0.0/proof_gen.bend as ProofGen
import Base
import minebender-game@1.0.0.0/types.bend as T
import minebender-game@1.0.0.0/game.bend as G

414def gen_cell.go(+z: G.Zone, +p: T.Pos, +need: Nat, +left: Nat, +rs: List<&2, U32>, +lp: Nat,
415  inv: {Nat.is_le(need, left) == True{} : Bool}, +s: Bool, e: {G.gen.out(z, p) == s : Bool},
416  +lft: {left == Nat.add(Bool.pick(Nat, s, 0n, 1n), lp) : Nat}) ->
417  GenStep(z, p, G.GenState{need, left, rs}, lp):
418  match s:
419    case True{}:
420      %Equal.sym(Bool, G.gen.out(z, p), True{}, e) :
421        {Nat.add(one(Bool.and(Bool.and(Bool.not(_), Nat.is_lt(0n, need)), G.gen.pick(need, left, rs))),
422          st_need(G.gen.next.go(_, Bool.and(Bool.and(Bool.not(_), Nat.is_lt(0n, need)),
423            G.gen.pick(need, left, rs)), need, left, rs))) == need : Nat} &
424        {Nat.is_le(st_need(G.gen.next.go(_, Bool.and(Bool.and(Bool.not(_), Nat.is_lt(0n, need)),
425            G.gen.pick(need, left, rs)), need, left, rs)),
426          st_left(G.gen.next.go(_, Bool.and(Bool.and(Bool.not(_), Nat.is_lt(0n, need)),
427            G.gen.pick(need, left, rs)), need, left, rs))) == True{} : Bool} &
428        {st_left(G.gen.next.go(_, Bool.and(Bool.and(Bool.not(_), Nat.is_lt(0n, need)),
429            G.gen.pick(need, left, rs)), need, left, rs)) == lp : Nat}
430      ({==}, (inv, lft))
431    case False{}:
432      %Equal.sym(Bool, G.gen.out(z, p), False{}, e) :
433        {Nat.add(one(Bool.and(Bool.and(Bool.not(_), Nat.is_lt(0n, need)), G.gen.pick(need, left, rs))),
434          st_need(G.gen.next.go(_, Bool.and(Bool.and(Bool.not(_), Nat.is_lt(0n, need)),
435            G.gen.pick(need, left, rs)), need, left, rs))) == need : Nat} &
436        {Nat.is_le(st_need(G.gen.next.go(_, Bool.and(Bool.and(Bool.not(_), Nat.is_lt(0n, need)),
437            G.gen.pick(need, left, rs)), need, left, rs)),
438          st_left(G.gen.next.go(_, Bool.and(Bool.and(Bool.not(_), Nat.is_lt(0n, need)),
439            G.gen.pick(need, left, rs)), need, left, rs))) == True{} : Bool} &
440        {st_left(G.gen.next.go(_, Bool.and(Bool.and(Bool.not(_), Nat.is_lt(0n, need)),
441            G.gen.pick(need, left, rs)), need, left, rs)) == lp : Nat}
442      %Equal.sym(Nat, left, 1n+lp, lft) :
443        {Nat.add(one(Bool.and(Nat.is_lt(0n, need), G.gen.pick(need, _, rs))),
444          Nat.sub(need, one(Bool.and(Nat.is_lt(0n, need), G.gen.pick(need, _, rs))))) == need : Nat} &
445        {Nat.is_le(Nat.sub(need, one(Bool.and(Nat.is_lt(0n, need), G.gen.pick(need, _, rs)))),
446          Nat.sub(_, 1n)) == True{} : Bool} &
447        {Nat.sub(_, 1n) == lp : Nat}
448      gen_cell.need(z, p, need, lp, rs,
449        {%lft : {Nat.is_le(need, _) == True{} : Bool}; inv : {Nat.is_le(need, 1n+lp) == True{} : Bool}})

Uses (25)

Used by (1)