kdrag.kernel
The kernel hold core proof datatypes and core inference rules. By and large, all proofs must flow through this module.
Module Attributes
defn holds definitional axioms for function symbols. |
Functions
|
Generate a fresh variable. |
|
Declare datatypes with auto generated induction principles. |
|
Prove an and from two kd.Proofs of its conjuncts. |
|
Assert an axiom. |
|
|
|
Compose two implications. |
|
Check if symbol f appears in body. |
|
Reserve a name. |
|
Define a non recursive definition. |
|
Define a recursive definition. |
|
A simple non recursive definition is a conservative extension https://en.wikipedia.org/wiki/Conservative_extension |
|
|
|
"Forget" a term using existentials. |
|
Get an overapproximation of free variables in a term. |
|
Generate fresh constants of same sort as quantifier. |
|
Generalize a theorem with respect to a list of schema variables. |
|
Herbrandize a theorem. |
|
Build a basic induction principle for an algebraic datatype |
|
Instantiate a universally quantified formula. |
|
|
|
Determined if expression head is in definitions. |
|
Check if a variable is a schema variable. |
|
|
|
Take an axiom of the form |= forall x0 x1 ..., xn, f(x0, x1, ..., xn) = body and return a Defn object for f. Unfolding judgments can be used with unfold_defns. |
|
Modus ponens for implies and equality. |
|
Skolemize an existential quantifier. |
|
Open a quantifier with fresh variables. |
|
Prove a theorem using a list of previously proved lemmas. |
|
Can register other unfoldings besides those generated by define. |
|
Rename bound variables and also attach triggers |
|
Instantiate a universally quantified formula forall xs, P(xs) -> P(ts) This is forall elimination |
|
Substitute using equality proofs |
|
Add e-matching triggers to a quantified proof. |
|
Unfold function definitions in an expression. |
|
Unfold definitions in an expression. |
|
Classes
Judgements should be constructed by smart constructors. |
|
|
It is unlikely that users should be accessing the Proof constructor directly. |
|
A record storing definition. |
Exceptions
- kdrag.kernel.FreshVar(prefix: str, sort: SortRef) ExprRef
Generate a fresh variable. This is distinguished from FreshConst by the fact that it has freshness evidence. This is intended to be used for constants that represent arbitrary terms (implicitly universally quantified). For example, axioms like c_fresh = t should never be asserted about bare FreshVars as they imply a probably inconsistent axiom, whereas asserting such an axiom about FreshConst is ok, effectively defining a new rigid constant.
>>> FreshVar("x", smt.IntSort()).fresh_evidence _FreshVarEvidence(v=x!...)
- Parameters:
prefix (str)
sort (SortRef)
- Return type:
ExprRef
- kdrag.kernel.Inductive(name: str, ctx=None, auto_fresh=False) Datatype
Declare datatypes with auto generated induction principles. Wrapper around z3.Datatype
>>> Nat = Inductive("Nat909") >>> Nat.declare("zero") >>> Nat.declare("succ", ("pred", Nat)) >>> Nat = Nat.create() >>> Nat.succ(Nat.zero) succ(zero)
- Parameters:
name (str)
- Return type:
Datatype
- class kdrag.kernel.Judgement
Bases:
objectJudgements should be constructed by smart constructors. Having an object of supertype judgement represents having shown some kind of truth. Judgements are the things that go above and below inference lines in a proof system. Don’t worry about it. It is just nice to have a name for the concept.
See: - https://en.wikipedia.org/wiki/Judgment_(mathematical_logic) - https://mathoverflow.net/questions/254518/what-exactly-is-a-judgement - https://ncatlab.org/nlab/show/judgment
- exception kdrag.kernel.LemmaError
Bases:
Exception- add_note(note, /)
Add a note to the exception
- args
- with_traceback(tb, /)
Set self.__traceback__ to tb and return self.
- class kdrag.kernel.Proof(fvs: frozenset[ExprRef], thm: BoolRef, reason: list[Any], admit: bool = False)
Bases:
JudgementIt is unlikely that users should be accessing the Proof constructor directly. This is not ironclad. If you really want the Proof constructor, I can’t stop you.
- Parameters:
fvs (frozenset[ExprRef])
thm (BoolRef)
reason (list[Any])
admit (bool)
- __call__(*args: ExprRef | Proof)
>>> x,y = smt.Ints("x y") >>> p = prove(smt.ForAll([y], smt.ForAll([x], x >= x - 1))) >>> p(x) |= ForAll(x, x >= x - 1) >>> p(x, 7) |= 7 >= 7 - 1
>>> a,b,c = smt.Bools("a b c") >>> ab = prove(smt.Implies(a,smt.Implies(a, a))) >>> a = axiom(a) >>> ab(a) |= Implies(a, a) >>> ab(a,a) |= a
- Parameters:
args (ExprRef | Proof)
- admit: bool = False
- forall(fresh_vars: list[ExprRef]) Proof
Generalize a proof involved schematic variables generated by FreshVar
>>> x = FreshVar("x", smt.IntSort()) >>> prove(x + 1 > x).forall([x]) |= ForAll(x!..., x!... + 1 > x!...)
- Parameters:
fresh_vars (list[ExprRef])
- Return type:
- fvs: frozenset[ExprRef]
- reason: list[Any]
- thm: BoolRef
- class kdrag.kernel.Unfolding(name: str, decl: FuncDeclRef, args: list[ExprRef], body: ExprRef, ax: Proof, _subst_fun_body: ExprRef)
Bases:
JudgementA record storing definition. It is useful to record definitions as special axioms because we often must unfold them. It’s more a recognition of a fact in unfoldable form
- Parameters:
name (str)
decl (FuncDeclRef)
args (list[ExprRef])
body (ExprRef)
ax (Proof)
_subst_fun_body (ExprRef)
- args: list[ExprRef]
- body: ExprRef
- decl: FuncDeclRef
- name: str
- kdrag.kernel.andI(pfs: Sequence[Proof]) Proof
Prove an and from two kd.Proofs of its conjuncts.
>>> a, b = smt.Bools("a b") >>> pa = kd.axiom(smt.Implies(True, a)) >>> pb = kd.axiom(smt.Implies(True, b)) >>> andI([pa, pb, pb]) |= Implies(True, And(a, b, b))
- kdrag.kernel.axiom(thm: BoolRef, fvs=frozenset({}), by=['axiom']) Proof
Assert an axiom.
Axioms are necessary and useful. But you must use great care.
- Parameters:
thm (BoolRef) – The axiom to assert.
by – A python object explaining why the axiom should exist. Often a string explaining the axiom.
- Return type:
- kdrag.kernel.choose(pf: Proof) tuple[list[FuncDeclRef], Proof]
Convert a theorem of the form |= forall xs, exists y0 y1… , P(xs, y0, y1, …) to |= forall xs, P(xs, f0(xs), f1(xs), …).
>>> x,y,z = smt.Ints("x y z") >>> pf = kd.prove(smt.ForAll([x], smt.Exists([y], y >= x))) >>> choose(pf) ([f!...], |= ForAll(x!..., f!...(x!...) >= x!...))
- kdrag.kernel.compose(ab: Proof, bc: Proof) Proof
Compose two implications. Useful for chaining implications.
>>> a,b,c = smt.Bools("a b c") >>> ab = axiom(smt.Implies(a, b)) >>> bc = axiom(smt.Implies(b, c)) >>> compose(ab, bc) |= Implies(a, c)
- kdrag.kernel.decl_occurs(f: FuncDeclRef, body: ExprRef) bool
Check if symbol f appears in body.
>>> x = smt.Int("x") >>> y = smt.Bool("y") >>> f = smt.Function("f", smt.IntSort(), smt.BoolSort(), smt.IntSort()) >>> assert decl_occurs(f, 1 + f(x, y)) >>> assert not decl_occurs(f, x + y + 1)
- Parameters:
f (FuncDeclRef)
body (ExprRef)
- Return type:
bool
- kdrag.kernel.declare(name: str, *sorts: SortRef) FuncDeclRef
Reserve a name. This helps avoid accidental clashing of axioms over the same symbol. It also make serialization possible and easier.
>>> declare("reserved_example", smt.IntSort()) reserved_example >>> declare("reserved_example", smt.IntSort()) Traceback (most recent call last): ... ValueError: ('Declaration name already reserved: reserved_example', 'with sorts', [], Int)
- Parameters:
name (str)
sorts (SortRef)
- Return type:
FuncDeclRef
- kdrag.kernel.define(name: str, args: list[ExprRef], body: ExprRef) FuncDeclRef
Define a non recursive definition. Useful for shorthand and abstraction. Does not currently defend against ill formed definitions. TODO: Check for bad circularity, record dependencies
- Parameters:
name (str) – The name of the term to define.
args (list[ExprRef]) – The arguments of the term.
defn – The definition of the term.
body (ExprRef)
- Returns:
A tuple of the defined term and the proof of the definition.
- Return type:
tuple[smt.FuncDeclRef, Proof]
- kdrag.kernel.define_fix(name: str, args: list[ExprRef], retsort, fix_lam) FuncDeclRef
Define a recursive definition.
- Parameters:
name (str)
args (list[ExprRef])
- Return type:
FuncDeclRef
- kdrag.kernel.define_simple(name: str, args: list[ExprRef], body: ExprRef) FuncDeclRef
A simple non recursive definition is a conservative extension https://en.wikipedia.org/wiki/Conservative_extension
>>> x = smt.Int("x") >>> define_simple("mysucc9034", [x], x + 1) mysucc9034 >>> f = smt.Function("f102", smt.IntSort(), smt.IntSort()) >>> define_simple("f102", [x], f(x)) Traceback (most recent call last): ... ValueError: ('Symbol appears in it's own definition. This is not a simple definition and requires further checks for consistency', f102, f102(x))
- Parameters:
name (str)
args (list[ExprRef])
body (ExprRef)
- Return type:
FuncDeclRef
- kdrag.kernel.defns: dict[FuncDeclRef, Unfolding] = {(Array (Array Sierpinski Bool) Bool).finite: Unfolding(name='(Array (Array Sierpinski Bool) Bool).finite', decl=(Array (Array Sierpinski Bool) Bool).finite, args=[A!1044], body=Exists(finwit!1043, ForAll(x!1042, A!1044[x!1042] == Contains(finwit!1043, Unit(x!1042)))), ax=|= ForAll(A, (Array (Array Sierpinski Bool) Bool).finite(A) == (Exists(finwit!1043, ForAll(x!1042, A[x!1042] == Contains(finwit!1043, Unit(x!1042)))))), _subst_fun_body=Exists(finwit!1043, ForAll(x!1042, Var(2)[x!1042] == Contains(finwit!1043, Unit(x!1042))))), (Array Bool Bool).choose: Unfolding(name='(Array Bool Bool).choose', decl=(Array Bool Bool).choose, args=[P!208], body=If(P!208[True], True, False), ax=|= ForAll(P, (Array Bool Bool).choose(P) == If(P[True], True, False)), _subst_fun_body=If(Var(0)[True], True, False)), (Array Bool Bool).finite: Unfolding(name='(Array Bool Bool).finite', decl=(Array Bool Bool).finite, args=[A!100], body=Exists(finwit!99, ForAll(x!98, A!100[x!98] == Contains(finwit!99, Unit(x!98)))), ax=|= ForAll(A, (Array Bool Bool).finite(A) == (Exists(finwit!99, ForAll(x!98, A[x!98] == Contains(finwit!99, Unit(x!98)))))), _subst_fun_body=Exists(finwit!99, ForAll(x!98, Var(2)[x!98] == Contains(finwit!99, Unit(x!98))))), (Array EReal Bool).finite: Unfolding(name='(Array EReal Bool).finite', decl=(Array EReal Bool).finite, args=[A!1655], body=Exists(finwit!1654, ForAll(x!1653, A!1655[x!1653] == Contains(finwit!1654, Unit(x!1653)))), ax=|= ForAll(A, (Array EReal Bool).finite(A) == (Exists(finwit!1654, ForAll(x!1653, A[x!1653] == Contains(finwit!1654, Unit(x!1653)))))), _subst_fun_body=Exists(finwit!1654, ForAll(x!1653, Var(2)[x!1653] == Contains(finwit!1654, Unit(x!1653))))), (Array Int Bool).choose: Unfolding(name='(Array Int Bool).choose', decl=(Array Int Bool).choose, args=[P!327], body=search(P!327, 0), ax=|= ForAll(P, (Array Int Bool).choose(P) == search(P, 0)), _subst_fun_body=search(Var(0), 0)), (Array Int Bool).finite: Unfolding(name='(Array Int Bool).finite', decl=(Array Int Bool).finite, args=[A!62], body=Exists(finwit!61, ForAll(x!60, A!62[x!60] == Contains(finwit!61, Unit(x!60)))), ax=|= ForAll(A, (Array Int Bool).finite(A) == (Exists(finwit!61, ForAll(x!60, A[x!60] == Contains(finwit!61, Unit(x!60)))))), _subst_fun_body=Exists(finwit!61, ForAll(x!60, Var(2)[x!60] == Contains(finwit!61, Unit(x!60))))), (Array Int C).add: Unfolding(name='(Array Int C).add', decl=(Array Int C).add, args=[a!1559, b!1560], body=Lambda(i, C.add(a!1559[i], b!1560[i])), ax=|= ForAll([a, b], (Array Int C).add(a, b) == (Lambda(i, C.add(a[i], b[i])))), _subst_fun_body=Lambda(i, C.add(Var(1)[i], Var(2)[i]))), (Array Int C).mul: Unfolding(name='(Array Int C).mul', decl=(Array Int C).mul, args=[a!1574, b!1575], body=Lambda(i, C.mul(a!1574[i], b!1575[i])), ax=|= ForAll([a, b], (Array Int C).mul(a, b) == (Lambda(i, C.mul(a[i], b[i])))), _subst_fun_body=Lambda(i, C.mul(Var(1)[i], Var(2)[i]))), (Array Int Real).add: Unfolding(name='(Array Int Real).add', decl=(Array Int Real).add, args=[a!1284, b!1285], body=Lambda(i, a!1284[i] + b!1285[i]), ax=|= ForAll([a, b], (Array Int Real).add(a, b) == (Lambda(i, a[i] + b[i]))), _subst_fun_body=Lambda(i, Var(1)[i] + Var(2)[i])), (Array Int Real).div_: Unfolding(name='(Array Int Real).div_', decl=(Array Int Real).div_, args=[a!1309, b!1310], body=Lambda(i, a!1309[i]/b!1310[i]), ax=|= ForAll([a, b], (Array Int Real).div_(a, b) == (Lambda(i, a[i]/b[i]))), _subst_fun_body=Lambda(i, Var(1)[i]/Var(2)[i])), (Array Int Real).mul: Unfolding(name='(Array Int Real).mul', decl=(Array Int Real).mul, args=[a!1296, b!1297], body=Lambda(i, a!1296[i]*b!1297[i]), ax=|= ForAll([a, b], (Array Int Real).mul(a, b) == (Lambda(i, a[i]*b[i]))), _subst_fun_body=Lambda(i, Var(1)[i]*Var(2)[i])), (Array Int Real).neg: Unfolding(name='(Array Int Real).neg', decl=(Array Int Real).neg, args=[a!1311], body=Lambda(i, -a!1311[i]), ax=|= ForAll(a, (Array Int Real).neg(a) == (Lambda(i, -a[i]))), _subst_fun_body=Lambda(i, -Var(1)[i])), (Array Int Real).sub: Unfolding(name='(Array Int Real).sub', decl=(Array Int Real).sub, args=[a!1294, b!1295], body=Lambda(i, a!1294[i] - b!1295[i]), ax=|= ForAll([a, b], (Array Int Real).sub(a, b) == (Lambda(i, a[i] - b[i]))), _subst_fun_body=Lambda(i, Var(1)[i] - Var(2)[i])), (Array Real Bool).finite: Unfolding(name='(Array Real Bool).finite', decl=(Array Real Bool).finite, args=[A!24], body=Exists(finwit!23, ForAll(x!22, A!24[x!22] == Contains(finwit!23, Unit(x!22)))), ax=|= ForAll(A, (Array Real Bool).finite(A) == (Exists(finwit!23, ForAll(x!22, A[x!22] == Contains(finwit!23, Unit(x!22)))))), _subst_fun_body=Exists(finwit!23, ForAll(x!22, Var(2)[x!22] == Contains(finwit!23, Unit(x!22))))), (Array Real Real).add: Unfolding(name='(Array Real Real).add', decl=(Array Real Real).add, args=[f!432, g!433], body=Lambda(x, f!432[x] + g!433[x]), ax=|= ForAll([f, g], (Array Real Real).add(f, g) == (Lambda(x, f[x] + g[x]))), _subst_fun_body=Lambda(x, Var(1)[x] + Var(2)[x])), (Array Real Real).div_: Unfolding(name='(Array Real Real).div_', decl=(Array Real Real).div_, args=[f!438, g!439], body=Lambda(x, f!438[x]/g!439[x]), ax=|= ForAll([f, g], (Array Real Real).div_(f, g) == (Lambda(x, f[x]/g[x]))), _subst_fun_body=Lambda(x, Var(1)[x]/Var(2)[x])), (Array Real Real).mul: Unfolding(name='(Array Real Real).mul', decl=(Array Real Real).mul, args=[f!436, g!437], body=Lambda(x, f!436[x]*g!437[x]), ax=|= ForAll([f, g], (Array Real Real).mul(f, g) == (Lambda(x, f[x]*g[x]))), _subst_fun_body=Lambda(x, Var(1)[x]*Var(2)[x])), (Array Real Real).sub: Unfolding(name='(Array Real Real).sub', decl=(Array Real Real).sub, args=[f!434, g!435], body=Lambda(x, f!434[x] - g!435[x]), ax=|= ForAll([f, g], (Array Real Real).sub(f, g) == (Lambda(x, f[x] - g[x]))), _subst_fun_body=Lambda(x, Var(1)[x] - Var(2)[x])), (Array Sierpinski Bool).finite: Unfolding(name='(Array Sierpinski Bool).finite', decl=(Array Sierpinski Bool).finite, args=[A!988], body=Exists(finwit!987, ForAll(x!986, A!988[x!986] == Contains(finwit!987, Unit(x!986)))), ax=|= ForAll(A, (Array Sierpinski Bool).finite(A) == (Exists(finwit!987, ForAll(x!986, A[x!986] == Contains(finwit!987, Unit(x!986)))))), _subst_fun_body=Exists(finwit!987, ForAll(x!986, Var(2)[x!986] == Contains(finwit!987, Unit(x!986))))), (Array Sierpinski Bool).open: Unfolding(name='(Array Sierpinski Bool).open', decl=(Array Sierpinski Bool).open, args=[A!1072], body=Or(A!1072 == K(Sierpinski, False), A!1072 == K(Sierpinski, True), A!1072 == Store(K(Sierpinski, False), S1, True)), ax=|= ForAll(A, (Array Sierpinski Bool).open(A) == Or(A == K(Sierpinski, False), A == K(Sierpinski, True), A == Store(K(Sierpinski, False), S1, True))), _subst_fun_body=Or(Var(0) == K(Sierpinski, False), Var(0) == K(Sierpinski, True), Var(0) == Store(K(Sierpinski, False), S1, True))), (Array Vec2 Bool).finite: Unfolding(name='(Array Vec2 Bool).finite', decl=(Array Vec2 Bool).finite, args=[A!1764], body=Exists(finwit!1763, ForAll(x!1762, A!1764[x!1762] == Contains(finwit!1763, Unit(x!1762)))), ax=|= ForAll(A, (Array Vec2 Bool).finite(A) == (Exists(finwit!1763, ForAll(x!1762, A[x!1762] == Contains(finwit!1763, Unit(x!1762)))))), _subst_fun_body=Exists(finwit!1763, ForAll(x!1762, Var(2)[x!1762] == Contains(finwit!1763, Unit(x!1762))))), Atom.fresh: Unfolding(name='Atom.fresh', decl=Atom.fresh, args=[x!1134, a!1135], body=a!1135 != x!1134, ax=|= ForAll([x, a], Atom.fresh(x, a) == a != x), _subst_fun_body=Var(1) != Var(0)), Atom.swap: Unfolding(name='Atom.swap', decl=Atom.swap, args=[x!1136, a!1137, b!1138], body=If(x!1136 == a!1137, b!1138, If(x!1136 == b!1138, a!1137, x!1136)), ax=|= ForAll([x, a, b], Atom.swap(x, a, b) == If(x == a, b, If(x == b, a, x))), _subst_fun_body=If(Var(0) == Var(1), Var(2), If(Var(0) == Var(2), Var(1), Var(0)))), BitVecN.to_int: Unfolding(name='BitVecN.to_int', decl=BitVecN.to_int, args=[x!189], body=If(Length(val(x!189)) == 0, 0, BV2Int(Nth(val(x!189), 0)) + 2* BitVecN.to_int(BitVecN(seq.extract(val(x!189), 1, Length(val(x!189)) - 1)))), ax=|= ForAll(x, BitVecN.to_int(x) == If(Length(val(x)) == 0, 0, BV2Int(Nth(val(x), 0)) + 2* BitVecN.to_int(BitVecN(seq.extract(val(x), 1, Length(val(x)) - 1))))), _subst_fun_body=If(Length(val(Var(0))) == 0, 0, BV2Int(Nth(val(Var(0)), 0)) + 2* BitVecN.to_int(BitVecN(seq.extract(val(Var(0)), 1, Length(val(Var(0))) - 1))))), C.add: Unfolding(name='C.add', decl=C.add, args=[z1!0, z2!1], body=C(re(z1!0) + re(z2!1), im(z1!0) + im(z2!1)), ax=|= ForAll([z1, z2], C.add(z1, z2) == C(re(z1) + re(z2), im(z1) + im(z2))), _subst_fun_body=C(re(Var(0)) + re(Var(1)), im(Var(0)) + im(Var(1)))), C.div_: Unfolding(name='C.div_', decl=C.div_, args=[z1!4, z2!5], body=C((re(z1!4)*re(z2!5) + im(z1!4)*im(z2!5))/ (re(z2!5)**2 + im(z2!5)**2), (im(z1!4)*re(z2!5) - re(z1!4)*im(z2!5))/ (re(z2!5)**2 + im(z2!5)**2)), ax=|= ForAll([z1, z2], C.div_(z1, z2) == C((re(z1)*re(z2) + im(z1)*im(z2))/ (re(z2)**2 + im(z2)**2), (im(z1)*re(z2) - re(z1)*im(z2))/ (re(z2)**2 + im(z2)**2))), _subst_fun_body=C((re(Var(0))*re(Var(1)) + im(Var(0))*im(Var(1)))/ (re(Var(1))**2 + im(Var(1))**2), (im(Var(0))*re(Var(1)) - re(Var(0))*im(Var(1)))/ (re(Var(1))**2 + im(Var(1))**2))), C.mul: Unfolding(name='C.mul', decl=C.mul, args=[z1!2, z2!3], body=C(re(z1!2)*re(z2!3) - im(z1!2)*im(z2!3), re(z1!2)*im(z2!3) + im(z1!2)*re(z2!3)), ax=|= ForAll([z1, z2], C.mul(z1, z2) == C(re(z1)*re(z2) - im(z1)*im(z2), re(z1)*im(z2) + im(z1)*re(z2))), _subst_fun_body=C(re(Var(0))*re(Var(1)) - im(Var(0))*im(Var(1)), re(Var(0))*im(Var(1)) + im(Var(0))*re(Var(1)))), C.norm2: Unfolding(name='C.norm2', decl=C.norm2, args=[z!1247], body=C.mul(z!1247, conj(z!1247)), ax=|= ForAll(z, C.norm2(z) == C.mul(z, conj(z))), _subst_fun_body=C.mul(Var(0), conj(Var(0)))), C.rezip: Unfolding(name='C.rezip', decl=C.rezip, args=[ab!1590], body=Lambda(i, C(_0(ab!1590)[i], _1(ab!1590)[i])), ax=|= ForAll(ab, C.rezip(ab) == (Lambda(i, C(_0(ab)[i], _1(ab)[i])))), _subst_fun_body=Lambda(i, C(_0(Var(1))[i], _1(Var(1))[i]))), C.unzip: Unfolding(name='C.unzip', decl=C.unzip, args=[a!1589], body=Tuple_Array_Array(Lambda(i, re(a!1589[i])), Lambda(i, im(a!1589[i]))), ax=|= ForAll(a, C.unzip(a) == Tuple_Array_Array(Lambda(i, re(a[i])), Lambda(i, im(a[i])))), _subst_fun_body=Tuple_Array_Array(Lambda(i, re(Var(1)[i])), Lambda(i, im(Var(1)[i])))), EPosReal.wf: Unfolding(name='EPosReal.wf', decl=EPosReal.wf, args=[x!1687], body=Implies(is(real, x!1687), val(x!1687) >= 0), ax=|= ForAll(x, EPosReal.wf(x) == Implies(is(real, x), val(x) >= 0)), _subst_fun_body=Implies(is(real, Var(0)), val(Var(0)) >= 0)), EReal.add: Unfolding(name='EReal.add', decl=EReal.add, args=[x!1614, y!1615], body=If(And(is(Real, x!1614), is(Real, y!1615)), Real(val(x!1614) + val(y!1615)), If(And(is(Inf, x!1614), Not(is(NegInf, y!1615))), Inf, If(And(Not(is(NegInf, x!1614)), is(Inf, y!1615)), Inf, If(And(is(NegInf, x!1614), Not(is(Inf, y!1615))), NegInf, If(And(Not(is(Inf, x!1614)), is(NegInf, y!1615)), NegInf, add_undef(x!1614, y!1615)))))), ax=|= ForAll([x, y], EReal.add(x, y) == If(And(is(Real, x), is(Real, y)), Real(val(x) + val(y)), If(And(is(Inf, x), Not(is(NegInf, y))), Inf, If(And(Not(is(NegInf, x)), is(Inf, y)), Inf, If(And(is(NegInf, x), Not(is(Inf, y))), NegInf, If(And(Not(is(Inf, x)), is(NegInf, y)), NegInf, add_undef(x, y))))))), _subst_fun_body=If(And(is(Real, Var(0)), is(Real, Var(1))), Real(val(Var(0)) + val(Var(1))), If(And(is(Inf, Var(0)), Not(is(NegInf, Var(1)))), Inf, If(And(Not(is(NegInf, Var(0))), is(Inf, Var(1))), Inf, If(And(is(NegInf, Var(0)), Not(is(Inf, Var(1)))), NegInf, If(And(Not(is(Inf, Var(0))), is(NegInf, Var(1))), NegInf, add_undef(Var(0), Var(1)))))))), EReal.le: Unfolding(name='EReal.le', decl=EReal.le, args=[x!1604, y!1605], body=If(x!1604 == y!1605, True, If(is(NegInf, x!1604), True, If(is(Inf, y!1605), True, If(is(NegInf, y!1605), False, If(is(Inf, x!1604), False, If(And(is(Real, x!1604), is(Real, y!1605)), val(x!1604) <= val(y!1605), unreachable!1603)))))), ax=|= ForAll([x, y], EReal.le(x, y) == If(x == y, True, If(is(NegInf, x), True, If(is(Inf, y), True, If(is(NegInf, y), False, If(is(Inf, x), False, If(And(is(Real, x), is(Real, y)), val(x) <= val(y), unreachable!1603))))))), _subst_fun_body=If(Var(0) == Var(1), True, If(is(NegInf, Var(0)), True, If(is(Inf, Var(1)), True, If(is(NegInf, Var(1)), False, If(is(Inf, Var(0)), False, If(And(is(Real, Var(0)), is(Real, Var(1))), val(Var(0)) <= val(Var(1)), unreachable!1603))))))), Interval.add: Unfolding(name='Interval.add', decl=Interval.add, args=[i!1812, j!1813], body=Interval(lo(i!1812) + lo(j!1813), hi(i!1812) + hi(j!1813)), ax=|= ForAll([i, j], Interval.add(i, j) == Interval(lo(i) + lo(j), hi(i) + hi(j))), _subst_fun_body=Interval(lo(Var(0)) + lo(Var(1)), hi(Var(0)) + hi(Var(1)))), Interval.mul: Unfolding(name='Interval.mul', decl=Interval.mul, args=[I!1826, J!1827], body=Interval(If(And(hi(I!1826)*hi(J!1827) <= lo(I!1826)*lo(J!1827), hi(I!1826)*hi(J!1827) <= hi(I!1826)*lo(J!1827), hi(I!1826)*hi(J!1827) <= lo(I!1826)*hi(J!1827)), hi(I!1826)*hi(J!1827), If(And(lo(I!1826)*lo(J!1827) <= hi(I!1826)*lo(J!1827), lo(I!1826)*lo(J!1827) <= lo(I!1826)*hi(J!1827)), lo(I!1826)*lo(J!1827), If(And(hi(I!1826)*lo(J!1827) <= lo(I!1826)*hi(J!1827)), hi(I!1826)*lo(J!1827), lo(I!1826)*hi(J!1827)))), If(And(hi(I!1826)*hi(J!1827) >= lo(I!1826)*lo(J!1827), hi(I!1826)*hi(J!1827) >= hi(I!1826)*lo(J!1827), hi(I!1826)*hi(J!1827) >= lo(I!1826)*hi(J!1827)), hi(I!1826)*hi(J!1827), If(And(lo(I!1826)*lo(J!1827) <= hi(I!1826)*lo(J!1827), lo(I!1826)*lo(J!1827) <= lo(I!1826)*hi(J!1827)), lo(I!1826)*lo(J!1827), If(And(hi(I!1826)*lo(J!1827) <= lo(I!1826)*hi(J!1827)), hi(I!1826)*lo(J!1827), lo(I!1826)*hi(J!1827))))), ax=|= ForAll([I, J], Interval.mul(I, J) == Interval(If(And(hi(I)*hi(J) <= lo(I)*lo(J), hi(I)*hi(J) <= hi(I)*lo(J), hi(I)*hi(J) <= lo(I)*hi(J)), hi(I)*hi(J), If(And(lo(I)*lo(J) <= hi(I)*lo(J), lo(I)*lo(J) <= lo(I)*hi(J)), lo(I)*lo(J), If(And(hi(I)*lo(J) <= lo(I)*hi(J)), hi(I)*lo(J), lo(I)*hi(J)))), If(And(hi(I)*hi(J) >= lo(I)*lo(J), hi(I)*hi(J) >= hi(I)*lo(J), hi(I)*hi(J) >= lo(I)*hi(J)), hi(I)*hi(J), If(And(lo(I)*lo(J) <= hi(I)*lo(J), lo(I)*lo(J) <= lo(I)*hi(J)), lo(I)*lo(J), If(And(hi(I)*lo(J) <= lo(I)*hi(J)), hi(I)*lo(J), lo(I)*hi(J)))))), _subst_fun_body=Interval(If(And(hi(Var(0))*hi(Var(1)) <= lo(Var(0))*lo(Var(1)), hi(Var(0))*hi(Var(1)) <= hi(Var(0))*lo(Var(1)), hi(Var(0))*hi(Var(1)) <= lo(Var(0))*hi(Var(1))), hi(Var(0))*hi(Var(1)), If(And(lo(Var(0))*lo(Var(1)) <= hi(Var(0))*lo(Var(1)), lo(Var(0))*lo(Var(1)) <= lo(Var(0))*hi(Var(1))), lo(Var(0))*lo(Var(1)), If(And(hi(Var(0))*lo(Var(1)) <= lo(Var(0))*hi(Var(1))), hi(Var(0))*lo(Var(1)), lo(Var(0))*hi(Var(1))))), If(And(hi(Var(0))*hi(Var(1)) >= lo(Var(0))*lo(Var(1)), hi(Var(0))*hi(Var(1)) >= hi(Var(0))*lo(Var(1)), hi(Var(0))*hi(Var(1)) >= lo(Var(0))*hi(Var(1))), hi(Var(0))*hi(Var(1)), If(And(lo(Var(0))*lo(Var(1)) <= hi(Var(0))*lo(Var(1)), lo(Var(0))*lo(Var(1)) <= lo(Var(0))*hi(Var(1))), lo(Var(0))*lo(Var(1)), If(And(hi(Var(0))*lo(Var(1)) <= lo(Var(0))*hi(Var(1))), hi(Var(0))*lo(Var(1)), lo(Var(0))*hi(Var(1))))))), Interval.setof: Unfolding(name='Interval.setof', decl=Interval.setof, args=[i!1793], body=Lambda(x, And(lo(i!1793) <= x, x <= hi(i!1793))), ax=|= ForAll(i, Interval.setof(i) == (Lambda(x, And(lo(i) <= x, x <= hi(i))))), _subst_fun_body=Lambda(x, And(lo(Var(1)) <= x, x <= hi(Var(1))))), Interval.sub: Unfolding(name='Interval.sub', decl=Interval.sub, args=[i!1819, j!1820], body=Interval(lo(i!1819) - hi(j!1820), hi(i!1819) - lo(j!1820)), ax=|= ForAll([i, j], Interval.sub(i, j) == Interval(lo(i) - hi(j), hi(i) - lo(j))), _subst_fun_body=Interval(lo(Var(0)) - hi(Var(1)), hi(Var(0)) - lo(Var(1)))), KnownBits_1.and_: Unfolding(name='KnownBits_1.and_', decl=KnownBits_1.and_, args=[x!730, y!731], body=KnownBits_1(ones(x!730) & ones(y!731), ~(~unknowns(x!730) & ~ones(x!730) | ~unknowns(y!731) & ~ones(y!731) | ones(x!730) & ones(y!731))), ax=|= ForAll([x, y], KnownBits_1.and_(x, y) == KnownBits_1(ones(x) & ones(y), ~(~unknowns(x) & ~ones(x) | ~unknowns(y) & ~ones(y) | ones(x) & ones(y)))), _subst_fun_body=KnownBits_1(ones(Var(0)) & ones(Var(1)), ~(~unknowns(Var(0)) & ~ones(Var(0)) | ~unknowns(Var(1)) & ~ones(Var(1)) | ones(Var(0)) & ones(Var(1))))), KnownBits_1.const: Unfolding(name='KnownBits_1.const', decl=KnownBits_1.const, args=[a!697], body=KnownBits_1(a!697, 0), ax=|= ForAll(a, KnownBits_1.const(a) == KnownBits_1(a, 0)), _subst_fun_body=KnownBits_1(Var(0), 0)), KnownBits_1.invert: Unfolding(name='KnownBits_1.invert', decl=KnownBits_1.invert, args=[x!721], body=KnownBits_1(~unknowns(x!721) & ~ones(x!721), unknowns(x!721)), ax=|= ForAll(x, KnownBits_1.invert(x) == KnownBits_1(~unknowns(x) & ~ones(x), unknowns(x))), _subst_fun_body=KnownBits_1(~unknowns(Var(0)) & ~ones(Var(0)), unknowns(Var(0)))), KnownBits_1.is_const: Unfolding(name='KnownBits_1.is_const', decl=KnownBits_1.is_const, args=[x!698], body=unknowns(x!698) == 0, ax=|= ForAll(x, KnownBits_1.is_const(x) == (unknowns(x) == 0)), _subst_fun_body=unknowns(Var(0)) == 0), KnownBits_1.or_: Unfolding(name='KnownBits_1.or_', decl=KnownBits_1.or_, args=[x!748, y!749], body=KnownBits_1(ones(x!748) | ones(y!749), ~(ones(x!748) | ones(y!749) | ~unknowns(x!748) & ~ones(x!748) & ~unknowns(y!749) & ~ones(y!749))), ax=|= ForAll([x, y], KnownBits_1.or_(x, y) == KnownBits_1(ones(x) | ones(y), ~(ones(x) | ones(y) | ~unknowns(x) & ~ones(x) & ~unknowns(y) & ~ones(y)))), _subst_fun_body=KnownBits_1(ones(Var(0)) | ones(Var(1)), ~(ones(Var(0)) | ones(Var(1)) | ~unknowns(Var(0)) & ~ones(Var(0)) & ~unknowns(Var(1)) & ~ones(Var(1))))), KnownBits_1.setof: Unfolding(name='KnownBits_1.setof', decl=KnownBits_1.setof, args=[x!695], body=Lambda(a, ~unknowns(x!695) & a == ones(x!695)), ax=|= ForAll(x, KnownBits_1.setof(x) == (Lambda(a, ~unknowns(x) & a == ones(x)))), _subst_fun_body=Lambda(a, ~unknowns(Var(1)) & a == ones(Var(1)))), KnownBits_1.wf: Unfolding(name='KnownBits_1.wf', decl=KnownBits_1.wf, args=[x!696], body=ones(x!696) & unknowns(x!696) == 0, ax=|= ForAll(x, KnownBits_1.wf(x) == (ones(x) & unknowns(x) == 0)), _subst_fun_body=ones(Var(0)) & unknowns(Var(0)) == 0), KnownBits_1.zeros: Unfolding(name='KnownBits_1.zeros', decl=KnownBits_1.zeros, args=[x!720], body=~unknowns(x!720) & ~ones(x!720), ax=|= ForAll(x, KnownBits_1.zeros(x) == ~unknowns(x) & ~ones(x)), _subst_fun_body=~unknowns(Var(0)) & ~ones(Var(0))), NDArray.add: Unfolding(name='NDArray.add', decl=NDArray.add, args=[u!2094, v!2095], body=If(shape(u!2094) == shape(v!2095), NDArray(shape(u!2094), Lambda(k, data(u!2094)[k] + data(v!2095)[k])), add_undef(u!2094, v!2095)), ax=|= ForAll([u, v], NDArray.add(u, v) == If(shape(u) == shape(v), NDArray(shape(u), Lambda(k, data(u)[k] + data(v)[k])), add_undef(u, v))), _subst_fun_body=If(shape(Var(0)) == shape(Var(1)), NDArray(shape(Var(0)), Lambda(k, data(Var(1))[k] + data(Var(2))[k])), add_undef(Var(0), Var(1)))), Nat.add: Unfolding(name='Nat.add', decl=Nat.add, args=[x!396, y!397], body=If(is(Z, x!396), y!397, S(Nat.add(pred(x!396), y!397))), ax=|= ForAll([x, y], Nat.add(x, y) == If(is(Z, x), y, S(Nat.add(pred(x), y)))), _subst_fun_body=If(is(Z, Var(0)), Var(1), S(Nat.add(pred(Var(0)), Var(1))))), PosEReal0.add: Unfolding(name='PosEReal0.add', decl=PosEReal0.add, args=[x!2037, y!2038], body=If(Or(is(Inf, x!2037), is(Inf, y!2038)), Inf, Fin(fin(x!2037) + fin(y!2038))), ax=|= ForAll([x, y], PosEReal0.add(x, y) == If(Or(is(Inf, x), is(Inf, y)), Inf, Fin(fin(x) + fin(y)))), _subst_fun_body=If(Or(is(Inf, Var(0)), is(Inf, Var(1))), Inf, Fin(fin(Var(0)) + fin(Var(1))))), PosEReal0.le: Unfolding(name='PosEReal0.le', decl=PosEReal0.le, args=[x!2049, y!2050], body=If(is(Inf, y!2050), True, If(is(Inf, x!2049), False, fin(x!2049) <= fin(y!2050))), ax=|= ForAll([x, y], PosEReal0.le(x, y) == If(is(Inf, y), True, If(is(Inf, x), False, fin(x) <= fin(y)))), _subst_fun_body=If(is(Inf, Var(1)), True, If(is(Inf, Var(0)), False, fin(Var(0)) <= fin(Var(1))))), PosEReal0.mul: Unfolding(name='PosEReal0.mul', decl=PosEReal0.mul, args=[x!2059, y!2060], body=If(Or(is(Inf, x!2059), is(Inf, y!2060)), Inf, Fin(fin(x!2059)*fin(y!2060))), ax=|= ForAll([x, y], PosEReal0.mul(x, y) == If(Or(is(Inf, x), is(Inf, y)), Inf, Fin(fin(x)*fin(y)))), _subst_fun_body=If(Or(is(Inf, Var(0)), is(Inf, Var(1))), Inf, Fin(fin(Var(0))*fin(Var(1))))), R.add: Unfolding(name='R.add', decl=R.add, args=[x!440, y!441], body=x!440 + y!441, ax=|= ForAll([x, y], R.add(x, y) == x + y), _subst_fun_body=Var(0) + Var(1)), R.dist: Unfolding(name='R.dist', decl=R.dist, args=[x!1228, y!1229], body=absR(x!1228 - y!1229), ax=|= ForAll([x!1206, y!1207], R.dist(x!1206, y!1207) == absR(x!1206 - y!1207)), _subst_fun_body=absR(Var(0) - Var(1))), R.max: Unfolding(name='R.max', decl=R.max, args=[x!530, y!531], body=If(x!530 >= y!531, x!530, y!531), ax=|= ForAll([x, y], R.max(x, y) == If(x >= y, x, y)), _subst_fun_body=If(Var(0) >= Var(1), Var(0), Var(1))), R.sqr: Unfolding(name='R.sqr', decl=R.sqr, args=[x!617], body=x!617*x!617, ax=|= ForAll(x, R.sqr(x) == x*x), _subst_fun_body=Var(0)*Var(0)), R.zero: Unfolding(name='R.zero', decl=R.zero, args=[], body=0, ax=|= R.zero == 0, _subst_fun_body=0), RFun.const: Unfolding(name='RFun.const', decl=RFun.const, args=[x!678], body=K(Real, x!678), ax=|= ForAll(x, RFun.const(x) == K(Real, x)), _subst_fun_body=K(Real, Var(0))), RFun.ident: Unfolding(name='RFun.ident', decl=RFun.ident, args=[], body=Lambda(x, x), ax=|= RFun.ident == (Lambda(x, x)), _subst_fun_body=Lambda(x, x)), RFun.smul: Unfolding(name='RFun.smul', decl=RFun.smul, args=[c!1688, f!1689], body=Lambda(x, mul(c!1688, f!1689[x])), ax=|= ForAll([c, f], RFun.smul(c, f) == (Lambda(x, mul(c, f[x])))), _subst_fun_body=Lambda(x, mul(Var(1), Var(2)[x]))), RSeq.const: Unfolding(name='RSeq.const', decl=RSeq.const, args=[x!1261], body=Lambda(i, x!1261), ax=|= ForAll(x, RSeq.const(x) == (Lambda(i, x))), _subst_fun_body=Lambda(i, Var(1))), RSeq.id: Unfolding(name='RSeq.id', decl=RSeq.id, args=[], body=Lambda(i, ToReal(i)), ax=|= RSeq.id == (Lambda(i, ToReal(i))), _subst_fun_body=Lambda(i, ToReal(i))), RSeq.rev: Unfolding(name='RSeq.rev', decl=RSeq.rev, args=[a!1269], body=Lambda(i, a!1269[-i]), ax=|= ForAll(a, RSeq.rev(a) == (Lambda(i, a[-i]))), _subst_fun_body=Lambda(i, Var(1)[-i])), RSeq.shift: Unfolding(name='RSeq.shift', decl=RSeq.shift, args=[a!1266, n!1267], body=Lambda(i, a!1266[i - n!1267]), ax=|= ForAll([a, n], RSeq.shift(a, n) == (Lambda(i, a[i - n]))), _subst_fun_body=Lambda(i, Var(1)[i - Var(2)])), RSeq.smul: Unfolding(name='RSeq.smul', decl=RSeq.smul, args=[x!1312, a!1313], body=Lambda(n, x!1312*a!1313[n]), ax=|= ForAll([x, a], RSeq.smul(x, a) == (Lambda(n, x*a[n]))), _subst_fun_body=Lambda(n, Var(1)*Var(2)[n])), RSeq.zero: Unfolding(name='RSeq.zero', decl=RSeq.zero, args=[], body=K(Int, 0), ax=|= RSeq.zero == K(Int, 0), _subst_fun_body=K(Int, 0)), RSet.has_lb: Unfolding(name='RSet.has_lb', decl=RSet.has_lb, args=[A!2018, M!2019], body=ForAll(x, Implies(A!2018[x], M!2019 <= x)), ax=|= ForAll([A, M], RSet.has_lb(A, M) == (ForAll(x, Implies(A[x], M <= x)))), _subst_fun_body=ForAll(x, Implies(Var(1)[x], Var(2) <= x))), RSet.inf: Unfolding(name='RSet.inf', decl=RSet.inf, args=[A!2020], body=RSet.sup(Lambda(x, RSet.has_lb(A!2020, x))), ax=|= ForAll(A, RSet.inf(A) == RSet.sup(Lambda(x, RSet.has_lb(A, x)))), _subst_fun_body=RSet.sup(Lambda(x, RSet.has_lb(Var(1), x)))), RSet.is_ub: Unfolding(name='RSet.is_ub', decl=RSet.is_ub, args=[A!1997], body=Exists(M, has_ub(A!1997, M)), ax=|= ForAll(A, RSet.is_ub(A) == (Exists(M, has_ub(A, M)))), _subst_fun_body=Exists(M, has_ub(Var(1), M))), RSet.sing: Unfolding(name='RSet.sing', decl=RSet.sing, args=[c!2016], body=Lambda(x, x == c!2016), ax=|= ForAll(c, RSet.sing(c) == (Lambda(x, x == c))), _subst_fun_body=Lambda(x, x == Var(1))), Real.sqrt: Unfolding(name='Real.sqrt', decl=Real.sqrt, args=[x!620], body=x!620**(1/2), ax=|= ForAll(x, Real.sqrt(x) == x**(1/2)), _subst_fun_body=Var(0)**(1/2)), T_Int.add: Unfolding(name='T_Int.add', decl=T_Int.add, args=[x!1139, y!1140], body=T_Int(Lambda(t, val(x!1139)[t] + val(y!1140)[t])), ax=|= ForAll([x, y], T_Int.add(x, y) == T_Int(Lambda(t, val(x)[t] + val(y)[t]))), _subst_fun_body=T_Int(Lambda(t, val(Var(1))[t] + val(Var(2))[t]))), T_Int.ge: Unfolding(name='T_Int.ge', decl=T_Int.ge, args=[x!1143, y!1144], body=T_Bool(Lambda(t, val(x!1143)[t] >= val(y!1144)[t])), ax=|= ForAll([x, y], T_Int.ge(x, y) == T_Bool(Lambda(t, val(x)[t] >= val(y)[t]))), _subst_fun_body=T_Bool(Lambda(t, val(Var(1))[t] >= val(Var(2))[t]))), T_Int.le: Unfolding(name='T_Int.le', decl=T_Int.le, args=[x!1145, y!1146], body=T_Bool(Lambda(t, val(x!1145)[t] <= val(y!1146)[t])), ax=|= ForAll([x, y], T_Int.le(x, y) == T_Bool(Lambda(t, val(x)[t] <= val(y)[t]))), _subst_fun_body=T_Bool(Lambda(t, val(Var(1))[t] <= val(Var(2))[t]))), T_Real.add: Unfolding(name='T_Real.add', decl=T_Real.add, args=[x!1141, y!1142], body=T_Real(Lambda(t, val(x!1141)[t] + val(y!1142)[t])), ax=|= ForAll([x, y], T_Real.add(x, y) == T_Real(Lambda(t, val(x)[t] + val(y)[t]))), _subst_fun_body=T_Real(Lambda(t, val(Var(1))[t] + val(Var(2))[t]))), Vec2.add: Unfolding(name='Vec2.add', decl=Vec2.add, args=[u!1719, v!1720], body=Vec2(x(u!1719) + x(v!1720), y(u!1719) + y(v!1720)), ax=|= ForAll([u, v], Vec2.add(u, v) == Vec2(x(u) + x(v), y(u) + y(v))), _subst_fun_body=Vec2(x(Var(0)) + x(Var(1)), y(Var(0)) + y(Var(1)))), Vec2.dist: Unfolding(name='Vec2.dist', decl=Vec2.dist, args=[u!1732, v!1733], body=Real.sqrt(Vec2.norm2(Vec2.sub(u!1732, v!1733))), ax=|= ForAll([u, v], Vec2.dist(u, v) == Real.sqrt(Vec2.norm2(Vec2.sub(u, v)))), _subst_fun_body=Real.sqrt(Vec2.norm2(Vec2.sub(Var(0), Var(1))))), Vec2.dot: Unfolding(name='Vec2.dot', decl=Vec2.dot, args=[u!1724, v!1725], body=x(u!1724)*x(v!1725) + y(u!1724)*y(v!1725), ax=|= ForAll([u, v], Vec2.dot(u, v) == x(u)*x(v) + y(u)*y(v)), _subst_fun_body=x(Var(0))*x(Var(1)) + y(Var(0))*y(Var(1))), Vec2.neg: Unfolding(name='Vec2.neg', decl=Vec2.neg, args=[u!1723], body=Vec2(-x(u!1723), -y(u!1723)), ax=|= ForAll(u, Vec2.neg(u) == Vec2(-x(u), -y(u))), _subst_fun_body=Vec2(-x(Var(0)), -y(Var(0)))), Vec2.norm: Unfolding(name='Vec2.norm', decl=Vec2.norm, args=[u!1727], body=Real.sqrt(Vec2.dot(u!1727, u!1727)), ax=|= ForAll(u, Vec2.norm(u) == Real.sqrt(Vec2.dot(u, u))), _subst_fun_body=Real.sqrt(Vec2.dot(Var(0), Var(0)))), Vec2.norm2: Unfolding(name='Vec2.norm2', decl=Vec2.norm2, args=[u!1726], body=Vec2.dot(u!1726, u!1726), ax=|= ForAll(u, Vec2.norm2(u) == Vec2.dot(u, u)), _subst_fun_body=Vec2.dot(Var(0), Var(0))), Vec2.sub: Unfolding(name='Vec2.sub', decl=Vec2.sub, args=[u!1721, v!1722], body=Vec2(x(u!1721) - x(v!1722), y(u!1721) - y(v!1722)), ax=|= ForAll([u, v], Vec2.sub(u, v) == Vec2(x(u) - x(v), y(u) - y(v))), _subst_fun_body=Vec2(x(Var(0)) - x(Var(1)), y(Var(0)) - y(Var(1)))), Vec3.add: Unfolding(name='Vec3.add', decl=Vec3.add, args=[u!2102, v!2103], body=Vec3(x(u!2102) + x(v!2103), y(u!2102) + y(v!2103), z(u!2102) + z(v!2103)), ax=|= ForAll([u, v], Vec3.add(u, v) == Vec3(x(u) + x(v), y(u) + y(v), z(u) + z(v))), _subst_fun_body=Vec3(x(Var(0)) + x(Var(1)), y(Var(0)) + y(Var(1)), z(Var(0)) + z(Var(1)))), Vec3.dist: Unfolding(name='Vec3.dist', decl=Vec3.dist, args=[u!2137, v!2138], body=Real.sqrt(Vec3.norm2(Vec3.sub(u!2137, v!2138))), ax=|= ForAll([u, v], Vec3.dist(u, v) == Real.sqrt(Vec3.norm2(Vec3.sub(u, v)))), _subst_fun_body=Real.sqrt(Vec3.norm2(Vec3.sub(Var(0), Var(1))))), Vec3.dot: Unfolding(name='Vec3.dot', decl=Vec3.dot, args=[u!2119, v!2120], body=x(u!2119)*x(v!2120) + y(u!2119)*y(v!2120) + z(u!2119)*z(v!2120), ax=|= ForAll([u, v], Vec3.dot(u, v) == x(u)*x(v) + y(u)*y(v) + z(u)*z(v)), _subst_fun_body=x(Var(0))*x(Var(1)) + y(Var(0))*y(Var(1)) + z(Var(0))*z(Var(1))), Vec3.neg: Unfolding(name='Vec3.neg', decl=Vec3.neg, args=[u!2108], body=Vec3(-x(u!2108), -y(u!2108), -z(u!2108)), ax=|= ForAll(u, Vec3.neg(u) == Vec3(-x(u), -y(u), -z(u))), _subst_fun_body=Vec3(-x(Var(0)), -y(Var(0)), -z(Var(0)))), Vec3.norm: Unfolding(name='Vec3.norm', decl=Vec3.norm, args=[u!2132], body=Real.sqrt(Vec3.norm2(u!2132)), ax=|= ForAll(u, Vec3.norm(u) == Real.sqrt(Vec3.norm2(u))), _subst_fun_body=Real.sqrt(Vec3.norm2(Var(0)))), Vec3.norm2: Unfolding(name='Vec3.norm2', decl=Vec3.norm2, args=[u!2128], body=Vec3.dot(u!2128, u!2128), ax=|= ForAll(u, Vec3.norm2(u) == Vec3.dot(u, u)), _subst_fun_body=Vec3.dot(Var(0), Var(0))), Vec3.smul: Unfolding(name='Vec3.smul', decl=Vec3.smul, args=[a!2109, u!2110], body=Vec3(a!2109*x(u!2110), a!2109*y(u!2110), a!2109*z(u!2110)), ax=|= ForAll([a, u], Vec3.smul(a, u) == Vec3(a*x(u), a*y(u), a*z(u))), _subst_fun_body=Vec3(Var(0)*x(Var(1)), Var(0)*y(Var(1)), Var(0)*z(Var(1)))), Vec3.sub: Unfolding(name='Vec3.sub', decl=Vec3.sub, args=[u!2106, v!2107], body=Vec3(x(u!2106) - x(v!2107), y(u!2106) - y(v!2107), z(u!2106) - z(v!2107)), ax=|= ForAll([u, v], Vec3.sub(u, v) == Vec3(x(u) - x(v), y(u) - y(v), z(u) - z(v))), _subst_fun_body=Vec3(x(Var(0)) - x(Var(1)), y(Var(0)) - y(Var(1)), z(Var(0)) - z(Var(1)))), ZF.elts: Unfolding(name='ZF.elts', decl=ZF.elts, args=[A!2168], body=Lambda(x, ∈(x, A!2168)), ax=|= ForAll(A, ZF.elts(A) == (Lambda(x, ∈(x, A)))), _subst_fun_body=Lambda(x, ∈(x, Var(1)))), ZF.sing: Unfolding(name='ZF.sing', decl=ZF.sing, args=[x!2241], body=upair(x!2241, x!2241), ax=|= ForAll(x, ZF.sing(x) == upair(x, x)), _subst_fun_body=upair(Var(0), Var(0))), ZFSet.le: Unfolding(name='ZFSet.le', decl=ZFSet.le, args=[A!2173, B!2174], body=ForAll(x, Implies(∈(x, A!2173), ∈(x, B!2174))), ax=|= ForAll([A, B], ZFSet.le(A, B) == (ForAll(x, Implies(∈(x, A), ∈(x, B))))), _subst_fun_body=ForAll(x, Implies(∈(x, Var(1)), ∈(x, Var(2))))), ZFSet.sub: Unfolding(name='ZFSet.sub', decl=ZFSet.sub, args=[A!2523, B!2524], body=sep(A!2523, Lambda(x, Not(∈(x, B!2524)))), ax=|= ForAll([A, B], ZFSet.sub(A, B) == sep(A, Lambda(x, Not(∈(x, B))))), _subst_fun_body=sep(Var(0), Lambda(x, Not(∈(x, Var(2)))))), ZSet.finite: Unfolding(name='ZSet.finite', decl=ZSet.finite, args=[A!340], body=And(ZSet.is_ub(A!340), ZSet.is_lb(A!340)), ax=|= ForAll(A, ZSet.finite(A) == And(ZSet.is_ub(A), ZSet.is_lb(A))), _subst_fun_body=And(ZSet.is_ub(Var(0)), ZSet.is_lb(Var(0)))), ZSet.has_lb: Unfolding(name='ZSet.has_lb', decl=ZSet.has_lb, args=[A!337, y!338], body=ForAll(x, Implies(A!337[x], y!338 <= x)), ax=|= ForAll([A, y], ZSet.has_lb(A, y) == (ForAll(x, Implies(A[x], y <= x)))), _subst_fun_body=ForAll(x, Implies(Var(1)[x], Var(2) <= x))), ZSet.has_ub: Unfolding(name='ZSet.has_ub', decl=ZSet.has_ub, args=[A!334, y!335], body=ForAll(x, Implies(A!334[x], x <= y!335)), ax=|= ForAll([A, y], ZSet.has_ub(A, y) == (ForAll(x, Implies(A[x], x <= y)))), _subst_fun_body=ForAll(x, Implies(Var(1)[x], x <= Var(2)))), ZSet.is_lb: Unfolding(name='ZSet.is_lb', decl=ZSet.is_lb, args=[A!339], body=Exists(x, ZSet.has_lb(A!339, x)), ax=|= ForAll(A, ZSet.is_lb(A) == (Exists(x, ZSet.has_lb(A, x)))), _subst_fun_body=Exists(x, ZSet.has_lb(Var(1), x))), ZSet.is_ub: Unfolding(name='ZSet.is_ub', decl=ZSet.is_ub, args=[A!336], body=Exists(x, ZSet.has_ub(A!336, x)), ax=|= ForAll(A, ZSet.is_ub(A) == (Exists(x, ZSet.has_ub(A, x)))), _subst_fun_body=Exists(x, ZSet.has_ub(Var(1), x))), abelian: Unfolding(name='abelian', decl=abelian, args=[], body=ForAll([x!796, y!797], mul(x!796, y!797) == mul(y!797, x!796)), ax=|= abelian == (ForAll([x!796, y!797], mul(x!796, y!797) == mul(y!797, x!796))), _subst_fun_body=ForAll([x!796, y!797], mul(x!796, y!797) == mul(y!797, x!796))), absR: Unfolding(name='absR', decl=absR, args=[x!463], body=If(x!463 >= 0, x!463, -x!463), ax=|= ForAll(x, absR(x) == If(x >= 0, x, -x)), _subst_fun_body=If(Var(0) >= 0, Var(0), -Var(0))), add_defined: Unfolding(name='add_defined', decl=add_defined, args=[x!1616, y!1617], body=Or(And(is(Real, x!1616), is(Real, y!1617)), And(is(Inf, x!1616), Not(is(NegInf, y!1617))), And(Not(is(NegInf, x!1616)), is(Inf, y!1617)), And(is(NegInf, x!1616), Not(is(Inf, y!1617))), And(Not(is(Inf, x!1616)), is(NegInf, y!1617))), ax=|= ForAll([x, y], add_defined(x, y) == Or(And(is(Real, x), is(Real, y)), And(is(Inf, x), Not(is(NegInf, y))), And(Not(is(NegInf, x)), is(Inf, y)), And(is(NegInf, x), Not(is(Inf, y))), And(Not(is(Inf, x)), is(NegInf, y)))), _subst_fun_body=Or(And(is(Real, Var(0)), is(Real, Var(1))), And(is(Inf, Var(0)), Not(is(NegInf, Var(1)))), And(Not(is(NegInf, Var(0))), is(Inf, Var(1))), And(is(NegInf, Var(0)), Not(is(Inf, Var(1)))), And(Not(is(Inf, Var(0))), is(NegInf, Var(1))))), aeq: Unfolding(name='aeq', decl=aeq, args=[x!506, y!507, eps!508], body=If(x!506 - y!507 > 0, x!506 - y!507, -(x!506 - y!507)) <= eps!508, ax=|= ForAll([x, y, eps], aeq(x, y, eps) == (If(x - y > 0, x - y, -(x - y)) <= eps)), _subst_fun_body=If(Var(0) - Var(1) > 0, Var(0) - Var(1), -(Var(0) - Var(1))) <= Var(2)), always: Unfolding(name='always', decl=always, args=[p!1163], body=T_Bool(Lambda(t!1161, ForAll(dt!1162, Implies(dt!1162 >= 0, val(p!1163)[t!1161 + dt!1162])))), ax=|= ForAll(p, always(p) == T_Bool(Lambda(t!1161, ForAll(dt!1162, Implies(dt!1162 >= 0, val(p)[t!1161 + dt!1162]))))), _subst_fun_body=T_Bool(Lambda(t!1161, ForAll(dt!1162, Implies(dt!1162 >= 0, val(Var(2))[t!1161 + dt!1162]))))), and1: Unfolding(name='and1', decl=and1, args=[x!771, y!772], body=not1(nand1(x!771, y!772)), ax=|= ForAll([x, y], and1(x, y) == not1(nand1(x, y))), _subst_fun_body=not1(nand1(Var(0), Var(1)))), and2: Unfolding(name='and2', decl=and2, args=[x!786, y!787], body=Concat(and1(Extract(1, 1, x!786), Extract(1, 1, y!787)), and1(Extract(0, 0, x!786), Extract(0, 0, y!787))), ax=|= ForAll([x, y], and2(x, y) == Concat(and1(Extract(1, 1, x), Extract(1, 1, y)), and1(Extract(0, 0, x), Extract(0, 0, y)))), _subst_fun_body=Concat(and1(Extract(1, 1, Var(0)), Extract(1, 1, Var(1))), and1(Extract(0, 0, Var(0)), Extract(0, 0, Var(1))))), ball: Unfolding(name='ball', decl=ball, args=[x!1211, r!1212], body=Lambda(y!1210, absR(y!1210 - x!1211) < r!1212), ax=|= ForAll([x!1206, r!1209], ball(x!1206, r!1209) == (Lambda(y!1210, absR(y!1210 - x!1206) < r!1209))), _subst_fun_body=Lambda(y!1210, absR(y!1210 - Var(1)) < Var(2))), bchoose: Unfolding(name='bchoose', decl=bchoose, args=[P!330, N!331], body=downsearch(P!330, N!331), ax=|= ForAll([P, N], bchoose(P, N) == downsearch(P, N)), _subst_fun_body=downsearch(Var(0), Var(1))), beq: Unfolding(name='beq', decl=beq, args=[p!1167, q!1168], body=T_Bool(Lambda(t!1166, val(p!1167)[t!1166] == val(q!1168)[t!1166])), ax=|= ForAll([p, q], beq(p, q) == T_Bool(Lambda(t!1166, val(p)[t!1166] == val(q)[t!1166]))), _subst_fun_body=T_Bool(Lambda(t!1166, val(Var(1))[t!1166] == val(Var(2))[t!1166]))), bexist: Unfolding(name='bexist', decl=bexist, args=[A!1087, n!1088], body=If(n!1088 < 0, False, Or(A!1087[n!1088], bexists(A!1087, n!1088 - 1))), ax=|= ForAll([A, n], bexist(A, n) == If(n < 0, False, Or(A[n], bexists(A, n - 1)))), _subst_fun_body=If(Var(1) < 0, False, Or(Var(0)[Var(1)], bexists(Var(0), Var(1) - 1)))), bexists: Unfolding(name='bexists', decl=bexists, args=[P!332, N!333], body=P!332[bchoose(P!332, N!333)], ax=|= ForAll([P, N], bexists(P, N) == P[bchoose(P, N)]), _subst_fun_body=Var(0)[bchoose(Var(0), Var(1))]), bforall: Unfolding(name='bforall', decl=bforall, args=[A!1089, n!1090], body=If(n!1090 < 0, True, And(A!1089[n!1090], bforall(A!1089, n!1090 - 1))), ax=|= ForAll([A, n], bforall(A, n) == If(n < 0, True, And(A[n], bforall(A, n - 1)))), _subst_fun_body=If(Var(1) < 0, True, And(Var(0)[Var(1)], bforall(Var(0), Var(1) - 1)))), biginter: Unfolding(name='biginter', decl=biginter, args=[a!2358], body=sep(pick(a!2358), Lambda(x, ForAll(b!2164, Implies(∈(b!2164, a!2358), ∈(x, b!2164))))), ax=|= ForAll(a!2163, biginter(a!2163) == sep(pick(a!2163), Lambda(x, ForAll(b!2164, Implies(∈(b!2164, a!2163), ∈(x, b!2164)))))), _subst_fun_body=sep(pick(Var(0)), Lambda(x, ForAll(b!2164, Implies(∈(b!2164, Var(2)), ∈(x, b!2164)))))), cauchy_mod: Unfolding(name='cauchy_mod', decl=cauchy_mod, args=[a!1513, mod!1514], body=ForAll(eps, Implies(eps > 0, ForAll([m, k], Implies(And(m > mod!1514[eps], k > mod!1514[eps]), absR(a!1513[m] - a!1513[k]) < eps)))), ax=|= ForAll([a, mod], cauchy_mod(a, mod) == (ForAll(eps, Implies(eps > 0, ForAll([m, k], Implies(And(m > mod[eps], k > mod[eps]), absR(a[m] - a[k]) < eps)))))), _subst_fun_body=ForAll(eps, Implies(eps > 0, ForAll([m, k], Implies(And(m > Var(4)[eps], k > Var(4)[eps]), absR(Var(3)[m] - Var(3)[k]) < eps))))), ceil: Unfolding(name='ceil', decl=ceil, args=[x!595], body=-floor(-x!595), ax=|= ForAll(x, ceil(x) == -floor(-x)), _subst_fun_body=-floor(-Var(0))), cinter: Unfolding(name='cinter', decl=cinter, args=[An!2034], body=Lambda(x, ForAll(n, An!2034[n][x])), ax=|= ForAll(An, cinter(An) == (Lambda(x, ForAll(n, An[n][x])))), _subst_fun_body=Lambda(x, ForAll(n, Var(2)[n][x]))), circle: Unfolding(name='circle', decl=circle, args=[c!1734, r!1735], body=Lambda(p, Vec2.norm2(Vec2.sub(p, c!1734)) == r!1735*r!1735), ax=|= ForAll([c, r], circle(c, r) == (Lambda(p, Vec2.norm2(Vec2.sub(p, c)) == r*r))), _subst_fun_body=Lambda(p, Vec2.norm2(Vec2.sub(p, Var(1))) == Var(2)*Var(2))), closed: Unfolding(name='closed', decl=closed, args=[A!1084], body=(Array Sierpinski Bool).open(complement(A!1084)), ax=|= ForAll(A, closed(A) == (Array Sierpinski Bool).open(complement(A))), _subst_fun_body=(Array Sierpinski Bool).open(complement(Var(0)))), closed_int: Unfolding(name='closed_int', decl=closed_int, args=[x!2012, y!2013], body=Lambda(z, And(x!2012 <= z, z <= y!2013)), ax=|= ForAll([x, y], closed_int(x, y) == (Lambda(z, And(x <= z, z <= y)))), _subst_fun_body=Lambda(z, And(Var(1) <= z, z <= Var(2)))), comp: Unfolding(name='comp', decl=comp, args=[f!676, g!677], body=Lambda(x, f!676[g!677[x]]), ax=|= ForAll([f, g], comp(f, g) == (Lambda(x, f[g[x]]))), _subst_fun_body=Lambda(x, Var(1)[Var(2)[x]])), conj: Unfolding(name='conj', decl=conj, args=[z!1237], body=C(re(z!1237), -im(z!1237)), ax=|= ForAll(z, conj(z) == C(re(z), -im(z))), _subst_fun_body=C(re(Var(0)), -im(Var(0)))), cont_at: Unfolding(name='cont_at', decl=cont_at, args=[f!684, x!685], body=ForAll(eps, Implies(eps > 0, Exists(delta, And(delta > 0, ForAll(y, Implies(absR(x!685 - y) < delta, absR(f!684[x!685] - f!684[y]) < eps)))))), ax=|= ForAll([f, x], cont_at(f, x) == (ForAll(eps, Implies(eps > 0, Exists(delta, And(delta > 0, ForAll(y, Implies(absR(x - y) < delta, absR(f[x] - f[y]) < eps)))))))), _subst_fun_body=ForAll(eps, Implies(eps > 0, Exists(delta, And(delta > 0, ForAll(y, Implies(absR(Var(4) - y) < delta, absR(Var(3)[Var(4)] - Var(3)[y]) < eps))))))), cross: Unfolding(name='cross', decl=cross, args=[u!2141, v!2142], body=Vec3(y(u!2141)*z(v!2142) - z(u!2141)*y(v!2142), z(u!2141)*x(v!2142) - x(u!2141)*z(v!2142), x(u!2141)*y(v!2142) - y(u!2141)*x(v!2142)), ax=|= ForAll([u, v], cross(u, v) == Vec3(y(u)*z(v) - z(u)*y(v), z(u)*x(v) - x(u)*z(v), x(u)*y(v) - y(u)*x(v))), _subst_fun_body=Vec3(y(Var(0))*z(Var(1)) - z(Var(0))*y(Var(1)), z(Var(0))*x(Var(1)) - x(Var(0))*z(Var(1)), x(Var(0))*y(Var(1)) - y(Var(0))*x(Var(1)))), cumsum: Unfolding(name='cumsum', decl=cumsum, args=[a!1328], body=Lambda(i, If(i == 0, a!1328[0], If(i > 0, cumsum(a!1328)[i - 1] + a!1328[i], -cumsum(a!1328)[i + 1] - a!1328[i + 1]))), ax=|= ForAll(a, cumsum(a) == (Lambda(i, If(i == 0, a[0], If(i > 0, cumsum(a)[i - 1] + a[i], -cumsum(a)[i + 1] - a[i + 1]))))), _subst_fun_body=Lambda(i, If(i == 0, Var(1)[0], If(i > 0, cumsum(Var(1))[i - 1] + Var(1)[i], -cumsum(Var(1))[i + 1] - Var(1)[i + 1])))), cunion: Unfolding(name='cunion', decl=cunion, args=[An!2035], body=Lambda(x, Exists(n, An!2035[n][x])), ax=|= ForAll(An, cunion(An) == (Lambda(x, Exists(n, An[n][x])))), _subst_fun_body=Lambda(x, Exists(n, Var(2)[n][x]))), decimate: Unfolding(name='decimate', decl=decimate, args=[a!1272, n!1273], body=Lambda(i, a!1272[i*n!1273]), ax=|= ForAll([a, n], decimate(a, n) == (Lambda(i, a[i*n]))), _subst_fun_body=Lambda(i, Var(1)[i*Var(2)])), delay: Unfolding(name='delay', decl=delay, args=[a!1268], body=RSeq.shift(a!1268, 1), ax=|= ForAll(a, delay(a) == RSeq.shift(a, 1)), _subst_fun_body=RSeq.shift(Var(0), 1)), diff: Unfolding(name='diff', decl=diff, args=[a!1283], body=Lambda(i, a!1283[i + 1] - a!1283[i]), ax=|= ForAll(a, diff(a) == (Lambda(i, a[i + 1] - a[i]))), _subst_fun_body=Lambda(i, Var(1)[i + 1] - Var(1)[i])), diff_at: Unfolding(name='diff_at', decl=diff_at, args=[f!682, x!683], body=Exists(y, has_diff_at(f!682, x!683, y)), ax=|= ForAll([f, x], diff_at(f, x) == (Exists(y, has_diff_at(f, x, y)))), _subst_fun_body=Exists(y, has_diff_at(Var(1), Var(2), y))), dilate: Unfolding(name='dilate', decl=dilate, args=[a!1270, n!1271], body=Lambda(i, a!1270[i/n!1271]), ax=|= ForAll([a, n], dilate(a, n) == (Lambda(i, a[i/n]))), _subst_fun_body=Lambda(i, Var(1)[i/Var(2)])), dom: Unfolding(name='dom', decl=dom, args=[R!2689], body=sep(bigunion(bigunion(R!2689)), Lambda(x, Exists(y, ∈(pair(x, y), R!2689)))), ax=|= ForAll(R, dom(R) == sep(bigunion(bigunion(R)), Lambda(x, Exists(y, ∈(pair(x, y), R))))), _subst_fun_body=sep(bigunion(bigunion(Var(0))), Lambda(x, Exists(y, ∈(pair(x, y), Var(2)))))), dommap: Unfolding(name='dommap', decl=dommap, args=[F!1264, a!1265], body=Lambda(i, a!1265[F!1264[i]]), ax=|= ForAll([F, a], dommap(F, a) == (Lambda(i, a[F[i]]))), _subst_fun_body=Lambda(i, Var(2)[Var(1)[i]])), double: Unfolding(name='double', decl=double, args=[n!395], body=If(is(Z, n!395), Z, S(S(double(pred(n!395))))), ax=|= ForAll(n, double(n) == If(is(Z, n), Z, S(S(double(pred(n)))))), _subst_fun_body=If(is(Z, Var(0)), Z, S(S(double(pred(Var(0))))))), downsearch: Unfolding(name='downsearch', decl=downsearch, args=[P!328, n!329], body=If(P!328[n!329], n!329, If(n!329 < 0, 0, downsearch(P!328, n!329 - 1))), ax=|= ForAll([P, n!302], downsearch(P, n!302) == If(P[n!302], n!302, If(n!302 < 0, 0, downsearch(P, n!302 - 1)))), _subst_fun_body=If(Var(0)[Var(1)], Var(1), If(Var(1) < 0, 0, downsearch(Var(0), Var(1) - 1)))), dvd: Unfolding(name='dvd', decl=dvd, args=[n!299, m!300], body=Exists(p, m!300 == n!299*p), ax=|= ForAll([n, m], dvd(n, m) == (Exists(p, m == n*p))), _subst_fun_body=Exists(p, Var(2) == Var(1)*p)), empty: Unfolding(name='empty', decl=empty, args=[], body=Interval(1, 0), ax=|= empty == Interval(1, 0), _subst_fun_body=Interval(1, 0)), even: Unfolding(name='even', decl=even, args=[x!272], body=Exists(y, x!272 == 2*y), ax=|= ForAll(x, even(x) == (Exists(y, x == 2*y))), _subst_fun_body=Exists(y, Var(1) == 2*y)), eventually: Unfolding(name='eventually', decl=eventually, args=[p!1160], body=T_Bool(Lambda(t!1158, Exists(dt!1159, And(dt!1159 >= 0, val(p!1160)[t!1158 + dt!1159])))), ax=|= ForAll(p, eventually(p) == T_Bool(Lambda(t!1158, Exists(dt!1159, And(dt!1159 >= 0, val(p)[t!1158 + dt!1159]))))), _subst_fun_body=T_Bool(Lambda(t!1158, Exists(dt!1159, And(dt!1159 >= 0, val(Var(2))[t!1158 + dt!1159]))))), expi: Unfolding(name='expi', decl=expi, args=[t!1248], body=C(Real.cos(t!1248), Real.sin(t!1248)), ax=|= ForAll(t, expi(t) == C(Real.cos(t), Real.sin(t))), _subst_fun_body=C(Real.cos(Var(0)), Real.sin(Var(0)))), eye: Unfolding(name='eye', decl=eye, args=[n!1470], body=Lambda([i, j], If(i == j, 1, 0)), ax=|= ForAll(n, eye(n) == (Lambda([i, j], If(i == j, 1, 0)))), _subst_fun_body=Lambda([i, j], If(i == j, 1, 0))), fact: Unfolding(name='fact', decl=fact, args=[n!301], body=If(n!301 <= 0, 1, n!301*fact(n!301 - 1)), ax=|= ForAll(n, fact(n) == If(n <= 0, 1, n*fact(n - 1))), _subst_fun_body=If(Var(0) <= 0, 1, Var(0)*fact(Var(0) - 1))), finsum: Unfolding(name='finsum', decl=finsum, args=[a!1424, n!1425], body=cumsum(a!1424)[n!1425], ax=|= ForAll([a, n], finsum(a, n) == cumsum(a)[n]), _subst_fun_body=cumsum(Var(0))[Var(1)]), floor: Unfolding(name='floor', decl=floor, args=[x!578], body=ToReal(ToInt(x!578)), ax=|= ForAll(x, floor(x) == ToReal(ToInt(x))), _subst_fun_body=ToReal(ToInt(Var(0)))), from_int: Unfolding(name='from_int', decl=from_int, args=[a!373], body=If(a!373 <= 0, Z, S(from_int(a!373 - 1))), ax=|= ForAll(a, from_int(a) == If(a <= 0, Z, S(from_int(a - 1)))), _subst_fun_body=If(Var(0) <= 0, Z, S(from_int(Var(0) - 1)))), from_nat: Unfolding(name='from_nat', decl=from_nat, args=[n!342], body=If(n!342%2 == 0, n!342/2, -(n!342 + 1)/2), ax=|= ForAll(n!302, from_nat(n!302) == If(n!302%2 == 0, n!302/2, -(n!302 + 1)/2)), _subst_fun_body=If(Var(0)%2 == 0, Var(0)/2, -(Var(0) + 1)/2)), fst: Unfolding(name='fst', decl=fst, args=[p!2561], body=pick(biginter(p!2561)), ax=|= ForAll(p!2167, fst(p!2167) == pick(biginter(p!2167))), _subst_fun_body=pick(biginter(Var(0)))), geom: Unfolding(name='geom', decl=geom, args=[x!1262], body=Lambda(i, pownat(x!1262, i)), ax=|= ForAll(x, geom(x) == (Lambda(i, pownat(x, i)))), _subst_fun_body=Lambda(i, pownat(Var(1), i))), has_bound: Unfolding(name='has_bound', decl=has_bound, args=[a!1507, M!1508], body=ForAll(n, absR(a!1507[n]) <= M!1508), ax=|= ForAll([a, M], has_bound(a, M) == (ForAll(n, absR(a[n]) <= M))), _subst_fun_body=ForAll(n, absR(Var(1)[n]) <= Var(2))), has_lim: Unfolding(name='has_lim', decl=has_lim, args=[a!1515, y!1516], body=ForAll(eps, Implies(eps > 0, Exists(N, ForAll(n, Implies(n > N, absR(a!1515[n] - y!1516) < eps))))), ax=|= ForAll([a, y], has_lim(a, y) == (ForAll(eps, Implies(eps > 0, Exists(N, ForAll(n, Implies(n > N, absR(a[n] - y) < eps))))))), _subst_fun_body=ForAll(eps, Implies(eps > 0, Exists(N, ForAll(n, Implies(n > N, absR(Var(3)[n] - Var(4)) < eps)))))), has_lim_at: Unfolding(name='has_lim_at', decl=has_lim_at, args=[f!679, p!680, L!681], body=ForAll(eps, Implies(0 < eps, Exists(delta, And(delta > 0, ForAll(x, Implies(And(0 < absR(x - p!680), absR(x - p!680) < delta), absR(f!679[x] - L!681) < eps)))))), ax=|= ForAll([f, p, L], has_lim_at(f, p, L) == (ForAll(eps, Implies(0 < eps, Exists(delta, And(delta > 0, ForAll(x, Implies(And(0 < absR(x - p), absR(x - p) < delta), absR(f[x] - L) < eps)))))))), _subst_fun_body=ForAll(eps, Implies(0 < eps, Exists(delta, And(delta > 0, ForAll(x, Implies(And(0 < absR(x - Var(4)), absR(x - Var(4)) < delta), absR(Var(3)[x] - Var(5)) < eps))))))), has_max: Unfolding(name='has_max', decl=has_max, args=[A!2008, x!2009], body=And(A!2008[x!2009], RSet.sup(A!2008) == x!2009), ax=|= ForAll([A, x], has_max(A, x) == And(A[x], RSet.sup(A) == x)), _subst_fun_body=And(Var(0)[Var(1)], RSet.sup(Var(0)) == Var(1))), has_sum: Unfolding(name='has_sum', decl=has_sum, args=[a!1555, y!1556], body=has_lim(cumsum(a!1555), y!1556), ax=|= ForAll([a, y], has_sum(a, y) == has_lim(cumsum(a), y)), _subst_fun_body=has_lim(cumsum(Var(0)), Var(1))), has_ub: Unfolding(name='has_ub', decl=has_ub, args=[A!1995, M!1996], body=ForAll(x, Implies(A!1995[x], x <= M!1996)), ax=|= ForAll([A, M], has_ub(A, M) == (ForAll(x, Implies(A[x], x <= M)))), _subst_fun_body=ForAll(x, Implies(Var(1)[x], x <= Var(2)))), iand: Unfolding(name='iand', decl=iand, args=[a!1094, b!1095], body=Prop(Lambda(w, And(val(a!1094)[w], val(b!1095)[w]))), ax=|= ForAll([a, b], iand(a, b) == Prop(Lambda(w, And(val(a)[w], val(b)[w])))), _subst_fun_body=Prop(Lambda(w, And(val(Var(1))[w], val(Var(2))[w])))), ieq: Unfolding(name='ieq', decl=ieq, args=[x!1194, y!1195], body=T_Bool(Lambda(t!1193, val(x!1194)[t!1193] == val(y!1195)[t!1193])), ax=|= ForAll([x, y], ieq(x, y) == T_Bool(Lambda(t!1193, val(x)[t!1193] == val(y)[t!1193]))), _subst_fun_body=T_Bool(Lambda(t!1193, val(Var(1))[t!1193] == val(Var(2))[t!1193]))), if_int: Unfolding(name='if_int', decl=if_int, args=[p!1202, x!1203, y!1204], body=T_Int(Lambda(t!1201, If(val(p!1202)[t!1201], val(x!1203)[t!1201], val(y!1204)[t!1201]))), ax=|= ForAll([p, x, y], if_int(p, x, y) == T_Int(Lambda(t!1201, If(val(p)[t!1201], val(x)[t!1201], val(y)[t!1201])))), _subst_fun_body=T_Int(Lambda(t!1201, If(val(Var(1))[t!1201], val(Var(2))[t!1201], val(Var(3))[t!1201])))), iimpl: Unfolding(name='iimpl', decl=iimpl, args=[a!1098, b!1099], body=Prop(Lambda(w, ForAll(u, Implies(acc(w, u), Implies(val(a!1098)[u], val(b!1099)[u]))))), ax=|= ForAll([a, b], iimpl(a, b) == Prop(Lambda(w, ForAll(u, Implies(acc(w, u), Implies(val(a)[u], val(b)[u])))))), _subst_fun_body=Prop(Lambda(w, ForAll(u, Implies(acc(w, u), Implies(val(Var(2))[u], val(Var(3))[u])))))), ind: Unfolding(name='ind', decl=ind, args=[S!1263], body=Lambda(i, If(S!1263[i], 1, 0)), ax=|= ForAll(S, ind(S) == (Lambda(i, If(S[i], 1, 0)))), _subst_fun_body=Lambda(i, If(Var(1)[i], 1, 0))), ineq: Unfolding(name='ineq', decl=ineq, args=[x!1197, y!1198], body=T_Bool(Lambda(t!1196, val(x!1197)[t!1196] != val(y!1198)[t!1196])), ax=|= ForAll([x, y], ineq(x, y) == T_Bool(Lambda(t!1196, val(x)[t!1196] != val(y)[t!1196]))), _subst_fun_body=T_Bool(Lambda(t!1196, val(Var(1))[t!1196] != val(Var(2))[t!1196]))), inext: Unfolding(name='inext', decl=inext, args=[x!1200], body=T_Int(Lambda(t!1199, val(x!1200)[t!1199 + 1])), ax=|= ForAll(x, inext(x) == T_Int(Lambda(t!1199, val(x)[t!1199 + 1]))), _subst_fun_body=T_Int(Lambda(t!1199, val(Var(1))[t!1199 + 1]))), inot: Unfolding(name='inot', decl=inot, args=[a!1100], body=Prop(Lambda(w, ForAll(u, Implies(acc(w, u), Implies(val(a!1100)[u], val(Prop(K(World, False)))[u]))))), ax=|= ForAll(a, inot(a) == Prop(Lambda(w, ForAll(u, Implies(acc(w, u), Implies(val(a)[u], val(Prop(K(World, False)))[u])))))), _subst_fun_body=Prop(Lambda(w, ForAll(u, Implies(acc(w, u), Implies(val(Var(2))[u], val(Prop(K(World, False)))[u])))))), inter: Unfolding(name='inter', decl=inter, args=[A!2376, B!2377], body=sep(A!2376, Lambda(x, ∈(x, B!2377))), ax=|= ForAll([A, B], inter(A, B) == sep(A, Lambda(x, ∈(x, B)))), _subst_fun_body=sep(Var(0), Lambda(x, ∈(x, Var(2))))), ior: Unfolding(name='ior', decl=ior, args=[a!1096, b!1097], body=Prop(Lambda(w, Or(val(a!1096)[w], val(b!1097)[w]))), ax=|= ForAll([a, b], ior(a, b) == Prop(Lambda(w, Or(val(a)[w], val(b)[w])))), _subst_fun_body=Prop(Lambda(w, Or(val(Var(1))[w], val(Var(2))[w])))), is_bounded: Unfolding(name='is_bounded', decl=is_bounded, args=[a!1509], body=Exists(M, has_bound(a!1509, M)), ax=|= ForAll(a, is_bounded(a) == (Exists(M, has_bound(a, M)))), _subst_fun_body=Exists(M, has_bound(Var(1), M))), is_cauchy: Unfolding(name='is_cauchy', decl=is_cauchy, args=[a!1512], body=ForAll(eps, Implies(eps > 0, Exists(N, ForAll([m, k], Implies(And(m > N, k > N), absR(a!1512[m] - a!1512[k]) < eps))))), ax=|= ForAll(a, is_cauchy(a) == (ForAll(eps, Implies(eps > 0, Exists(N, ForAll([m, k], Implies(And(m > N, k > N), absR(a[m] - a[k]) < eps))))))), _subst_fun_body=ForAll(eps, Implies(eps > 0, Exists(N, ForAll([m, k], Implies(And(m > N, k > N), absR(Var(4)[m] - Var(4)[k]) < eps)))))), is_circle: Unfolding(name='is_circle', decl=is_circle, args=[A!1792], body=Exists([c, r], circle(c, r) == A!1792), ax=|= ForAll(A, is_circle(A) == (Exists([c, r], circle(c, r) == A))), _subst_fun_body=Exists([c, r], circle(c, r) == Var(2))), is_cont: Unfolding(name='is_cont', decl=is_cont, args=[f!690], body=ForAll(x, cont_at(f!690, x)), ax=|= ForAll(f, is_cont(f) == (ForAll(x, cont_at(f, x)))), _subst_fun_body=ForAll(x, cont_at(Var(1), x))), is_conv: Unfolding(name='is_conv', decl=is_conv, args=[a!1517], body=Exists(y, has_lim(a!1517, y)), ax=|= ForAll(a, is_conv(a) == (Exists(y, has_lim(a, y)))), _subst_fun_body=Exists(y, has_lim(Var(1), y))), is_diff: Unfolding(name='is_diff', decl=is_diff, args=[f!689], body=ForAll(x, diff_at(f!689, x)), ax=|= ForAll(f, is_diff(f) == (ForAll(x, diff_at(f, x)))), _subst_fun_body=ForAll(x, diff_at(Var(1), x))), is_empty: Unfolding(name='is_empty', decl=is_empty, args=[I!1809], body=hi(i) > lo(i), ax=|= ForAll(I, is_empty(I) == (hi(i) > lo(i))), _subst_fun_body=hi(i) > lo(i)), is_idem: Unfolding(name='is_idem', decl=is_idem, args=[A!959], body=mul(A!959, A!959) == A!959, ax=|= ForAll(A, is_idem(A) == (mul(A, A) == A)), _subst_fun_body=mul(Var(0), Var(0)) == Var(0)), is_linear: Unfolding(name='is_linear', decl=is_linear, args=[f!1690], body=And(ForAll([x, y], f!1690[R.add(x, y)] == R.add(f!1690[x], f!1690[y])), ForAll([x, c], f!1690[mul(c, x)] == mul(c, f!1690[x]))), ax=|= ForAll(f, is_linear(f) == And(ForAll([x, y], f[R.add(x, y)] == R.add(f[x], f[y])), ForAll([x, c], f[mul(c, x)] == mul(c, f[x])))), _subst_fun_body=And(ForAll([x, y], Var(2)[R.add(x, y)] == R.add(Var(2)[x], Var(2)[y])), ForAll([x, c], Var(2)[mul(c, x)] == mul(c, Var(2)[x])))), is_lub: Unfolding(name='is_lub', decl=is_lub, args=[A!1685, x!1686], body=And(upper_bound(A!1685, x!1686), ForAll(y, Implies(upper_bound(A!1685, y), EReal.le(x!1686, y)))), ax=|= ForAll([A, x], is_lub(A, x) == And(upper_bound(A, x), ForAll(y, Implies(upper_bound(A, y), EReal.le(x, y))))), _subst_fun_body=And(upper_bound(Var(0), Var(1)), ForAll(y, Implies(upper_bound(Var(1), y), EReal.le(Var(2), y))))), is_monotone: Unfolding(name='is_monotone', decl=is_monotone, args=[a!1510], body=ForAll([n, m], Implies(n <= m, a!1510[n] <= a!1510[m])), ax=|= ForAll(a, is_monotone(a) == (ForAll([n, m], Implies(n <= m, a[n] <= a[m])))), _subst_fun_body=ForAll([n, m], Implies(n <= m, Var(2)[n] <= Var(2)[m]))), is_nonneg: Unfolding(name='is_nonneg', decl=is_nonneg, args=[a!1511], body=ForAll(n, a!1511[n] >= 0), ax=|= ForAll(a, is_nonneg(a) == (ForAll(n, a[n] >= 0))), _subst_fun_body=ForAll(n, Var(1)[n] >= 0)), is_open: Unfolding(name='is_open', decl=is_open, args=[S!1213], body=ForAll(x!1206, Implies(S!1213[x!1206], Exists(r!1209, And(0 < r!1209, subset(ball(x!1206, r!1209), S!1213))))), ax=|= ForAll(S, is_open(S) == (ForAll(x!1206, Implies(S[x!1206], Exists(r!1209, And(0 < r!1209, subset(ball(x!1206, r!1209), S))))))), _subst_fun_body=ForAll(x!1206, Implies(Var(1)[x!1206], Exists(r!1209, And(0 < r!1209, subset(ball(x!1206, r!1209), Var(2))))))), is_orth: Unfolding(name='is_orth', decl=is_orth, args=[A!958], body=mul(A!958, trans(A!958)) == I, ax=|= ForAll(A, is_orth(A) == (mul(A, trans(A)) == I)), _subst_fun_body=mul(Var(0), trans(Var(0))) == I), is_pair: Unfolding(name='is_pair', decl=is_pair, args=[c!2560], body=Exists([a!2163, b!2164], pair(a!2163, b!2164) == c!2560), ax=|= ForAll(c!2165, is_pair(c!2165) == (Exists([a!2163, b!2164], pair(a!2163, b!2164) == c!2165))), _subst_fun_body=Exists([a!2163, b!2164], pair(a!2163, b!2164) == Var(2))), is_rel: Unfolding(name='is_rel', decl=is_rel, args=[R!2688], body=ForAll(p!2167, Implies(∈(p!2167, R!2688), is_pair(p!2167))), ax=|= ForAll(R, is_rel(R) == (ForAll(p!2167, Implies(∈(p!2167, R), is_pair(p!2167))))), _subst_fun_body=ForAll(p!2167, Implies(∈(p!2167, Var(1)), is_pair(p!2167)))), is_set: Unfolding(name='is_set', decl=is_set, args=[P!2171], body=Exists(A, reflects(P!2171, A)), ax=|= ForAll(P, is_set(P) == (Exists(A, reflects(P, A)))), _subst_fun_body=Exists(A, reflects(Var(1), A))), is_summable: Unfolding(name='is_summable', decl=is_summable, args=[a!1557], body=Exists(y, has_sum(a!1557, y)), ax=|= ForAll(a, is_summable(a) == (Exists(y, has_sum(a, y)))), _subst_fun_body=Exists(y, has_sum(Var(1), y))), is_symm: Unfolding(name='is_symm', decl=is_symm, args=[A!957], body=trans(A!957) == A!957, ax=|= ForAll(A, is_symm(A) == (trans(A) == A)), _subst_fun_body=trans(Var(0)) == Var(0)), iterate: Unfolding(name='iterate', decl=iterate, args=[f!1274, x!1275], body=Lambda(i, If(i <= 0, x!1275, f!1274[iterate(f!1274, x!1275)[ToReal(i - 1)]])), ax=|= ForAll([f, x], iterate(f, x) == (Lambda(i, If(i <= 0, x, f[iterate(f, x)[ToReal(i - 1)]])))), _subst_fun_body=Lambda(i, If(i <= 0, Var(2), Var(1)[iterate(Var(1), Var(2))[ToReal(i - 1)]]))), join: Unfolding(name='join', decl=join, args=[i!1803, j!1804], body=Interval(min(lo(i!1803), lo(j!1804)), R.max(hi(i!1803), hi(j!1804))), ax=|= ForAll([i, j], join(i, j) == Interval(min(lo(i), lo(j)), R.max(hi(i), hi(j)))), _subst_fun_body=Interval(min(lo(Var(0)), lo(Var(1))), R.max(hi(Var(0)), hi(Var(1))))), krondelta: Unfolding(name='krondelta', decl=krondelta, args=[n!1279], body=Lambda(i, If(i == n!1279, 1, 0)), ax=|= ForAll(n, krondelta(n) == (Lambda(i, If(i == n, 1, 0)))), _subst_fun_body=Lambda(i, If(i == Var(1), 1, 0))), lim: Unfolding(name='lim', decl=lim, args=[A!1519], body=f!1518(A!1519), ax=|= ForAll(A!1258, lim(A!1258) == f!1518(A!1258)), _subst_fun_body=f!1518(Var(0))), max: Unfolding(name='max', decl=max, args=[a!1379], body=Lambda(i, If(i == 0, a!1379[0], If(i > 0, R.max(max(a!1379)[i - 1], a!1379[i]), R.max(max(a!1379)[i + 1], a!1379[i])))), ax=|= ForAll(a, max(a) == (Lambda(i, If(i == 0, a[0], If(i > 0, R.max(max(a)[i - 1], a[i]), R.max(max(a)[i + 1], a[i])))))), _subst_fun_body=Lambda(i, If(i == 0, Var(1)[0], If(i > 0, R.max(max(Var(1))[i - 1], Var(1)[i]), R.max(max(Var(1))[i + 1], Var(1)[i]))))), meet: Unfolding(name='meet', decl=meet, args=[i!1794, j!1795], body=Interval(R.max(lo(i!1794), lo(j!1795)), min(hi(i!1794), hi(j!1795))), ax=|= ForAll([i, j], meet(i, j) == Interval(R.max(lo(i), lo(j)), min(hi(i), hi(j)))), _subst_fun_body=Interval(R.max(lo(Var(0)), lo(Var(1))), min(hi(Var(0)), hi(Var(1))))), mid: Unfolding(name='mid', decl=mid, args=[i!1811], body=(lo(i!1811) + hi(i!1811))/2, ax=|= ForAll(i, mid(i) == (lo(i) + hi(i))/2), _subst_fun_body=(lo(Var(0)) + hi(Var(0)))/2), min: Unfolding(name='min', decl=min, args=[x!549, y!550], body=If(x!549 <= y!550, x!549, y!550), ax=|= ForAll([x, y], min(x, y) == If(x <= y, x, y)), _subst_fun_body=If(Var(0) <= Var(1), Var(0), Var(1))), mu: Unfolding(name='mu', decl=mu, args=[A!1093], body=mu_iter(A!1093, 0), ax=|= ForAll(A, mu(A) == mu_iter(A, 0)), _subst_fun_body=mu_iter(Var(0), 0)), mu_iter: Unfolding(name='mu_iter', decl=mu_iter, args=[A!1091, n!1092], body=If(A!1091[n!1092], n!1092, mu_iter(A!1091, n!1092 + 1)), ax=|= ForAll([A, n], mu_iter(A, n) == If(A[n], n, mu_iter(A, n + 1))), _subst_fun_body=If(Var(0)[Var(1)], Var(1), mu_iter(Var(0), Var(1) + 1))), mul: Unfolding(name='mul', decl=mul, args=[x!451, y!452], body=x!451*y!452, ax=|= ForAll([x, y], mul(x, y) == x*y), _subst_fun_body=Var(0)*Var(1)), nand1: Unfolding(name='nand1', decl=nand1, args=[x!766, y!767], body=~(x!766 & y!767), ax=|= ForAll([x, y], nand1(x, y) == ~(x & y)), _subst_fun_body=~(Var(0) & Var(1))), nand2: Unfolding(name='nand2', decl=nand2, args=[x!781, y!782], body=Concat(nand1(Extract(1, 1, x!781), Extract(1, 1, y!782)), nand1(Extract(0, 0, x!781), Extract(0, 0, y!782))), ax=|= ForAll([x, y], nand2(x, y) == Concat(nand1(Extract(1, 1, x), Extract(1, 1, y)), nand1(Extract(0, 0, x), Extract(0, 0, y)))), _subst_fun_body=Concat(nand1(Extract(1, 1, Var(0)), Extract(1, 1, Var(1))), nand1(Extract(0, 0, Var(0)), Extract(0, 0, Var(1))))), nand2step: Unfolding(name='nand2step', decl=nand2step, args=[st!120], body=If(rom(st!120)[pc(st!120)] >> 15 == 0, Nand2State(pc(st!120) + 1, rom(st!120), ram(st!120), D(st!120), rom(st!120)[pc(st!120)]), Nand2State(If(If(rom(st!120)[pc(st!120)] & 7 == 0, False, If(rom(st!120)[pc(st!120)] & 7 == 1, If(rom(st!120)[pc(st!120)] >> 6 & 127 == 42, 0, If(rom(st!120)[pc(st!120)] >> 6 & 127 == 63, 1, If(rom(st!120)[pc(st!120)] >> 6 & 127 == 58, 65535, If(rom(st!120)[pc(st!120)] >> 6 & 127 == 12, D(st!120), If(rom(st!120)[pc(st!120)] >> 6 & 127 == 48, A(st!120), If(rom(st!120)[pc(st!120)] >> 6 & 127 == 112, rom(st!120)[A(st!120)], If(rom(st!120)[pc(st!120)] >> 6 & 127 == 13, ~D(st!120), If(rom(st!120)[pc(st!120)] >> 6 & 127 == 49, ~A(st!120), If(rom(st!120)[pc(st!120)] >> 6 & 127 == 113, ~rom(st!120)[A(st!120)], If(rom(...)[pc(...)] >> 6 & 127 == 15, -D(st!120), If(...[...] >> 6 & 127 == 51, -A(st!120), If(... >> ... & 127 == 115, -rom(...)[A(...)], If(... & ... == 31, D(...) + 1, If(... == ..., ... + ..., If(..., ..., ...))))))))))))))) > 0, If(rom(st!120)[pc(st!120)] & 7 == 2, If(rom(st!120)[pc(st!120)] >> 6 & 127 == 42, 0, If(rom(st!120)[pc(st!120)] >> 6 & 127 == 63, 1, If(rom(st!120)[pc(st!120)] >> 6 & 127 == 58, 65535, If(rom(st!120)[pc(st!120)] >> 6 & 127 == 12, D(st!120), If(rom(st!120)[pc(st!120)] >> 6 & 127 == 48, A(st!120), If(rom(st!120)[pc(st!120)] >> 6 & 127 == 112, rom(st!120)[A(st!120)], If(rom(st!120)[pc(st!120)] >> 6 & 127 == 13, ~D(st!120), If(rom(st!120)[pc(st!120)] >> 6 & 127 == 49, ~A(st!120), If(rom(...)[pc(...)] >> 6 & 127 == 113, ~rom(st!120)[A(st!120)], If(...[...] >> 6 & 127 == 15, -D(st!120), If(... >> ... & 127 == 51, -A(st!120), If(... & ... == 115, -...[...], If(... == ..., ... + ..., If(..., ..., ...)))))))))))))) == 0, If(rom(st!120)[pc(st!120)] & 7 == 3, If(rom(st!120)[pc(st!120)] >> 6 & 127 == 42, 0, If(rom(st!120)[pc(st!120)] >> 6 & 127 == 63, 1, If(rom(st!120)[pc(st!120)] >> 6 & 127 == 58, 65535, If(rom(st!120)[pc(st!120)] >> 6 & 127 == 12, D(st!120), If(rom(st!120)[pc(st!120)] >> 6 & 127 == 48, A(st!120), If(rom(st!120)[pc(st!120)] >> 6 & 127 == 112, rom(st!120)[A(st!120)], If(rom(st!120)[pc(st!120)] >> 6 & 127 == 13, ~D(st!120), If(rom(...)[pc(...)] >> 6 & 127 == 49, ~A(st!120), If(...[...] >> 6 & 127 == 113, ~rom(st!120)[A(st!120)], If(... >> ... & 127 == 15, -D(st!120), If(... & ... == 51, -A(...), If(... == ..., -..., If(..., ..., ...))))))))))))) >= 0, If(rom(st!120)[pc(st!120)] & 7 == 4, If(rom(st!120)[pc(st!120)] >> 6 & 127 == 42, 0, If(rom(st!120)[pc(st!120)] >> 6 & 127 == 63, 1, If(rom(st!120)[pc(st!120)] >> 6 & 127 == 58, 65535, If(rom(st!120)[pc(st!120)] >> 6 & 127 == 12, ..., ax=|= ForAll(st, nand2step(st) == If(rom(st)[pc(st)] >> 15 == 0, Nand2State(pc(st) + 1, rom(st), ram(st), D(st), rom(st)[pc(st)]), Nand2State(If(If(rom(st)[pc(st)] & 7 == 0, False, If(rom(st)[pc(st)] & 7 == 1, If(rom(st)[pc(st)] >> 6 & 127 == 42, 0, If(rom(st)[pc(st)] >> 6 & 127 == 63, 1, If(rom(st)[pc(st)] >> 6 & 127 == 58, 65535, If(rom(st)[pc(st)] >> 6 & 127 == 12, D(st), If(rom(st)[pc(st)] >> 6 & 127 == 48, A(st), If(rom(st)[pc(st)] >> 6 & 127 == 112, rom(st)[A(st)], If(rom(st)[pc(st)] >> 6 & 127 == 13, ~D(st), If(rom(...)[pc(...)] >> 6 & 127 == 49, ~A(st), If(...[...] >> 6 & 127 == 113, ~rom(st)[A(st)], If(... >> ... & 127 == 15, -D(st), If(... & ... == 51, -A(...), If(... == ..., -..., If(..., ..., ...))))))))))))) > 0, If(rom(st)[pc(st)] & 7 == 2, If(rom(st)[pc(st)] >> 6 & 127 == 42, 0, If(rom(st)[pc(st)] >> 6 & 127 == 63, 1, If(rom(st)[pc(st)] >> 6 & 127 == 58, 65535, If(rom(st)[pc(st)] >> 6 & 127 == 12, D(st), If(rom(st)[pc(st)] >> 6 & 127 == 48, A(st), If(rom(st)[pc(st)] >> 6 & 127 == 112, rom(st)[A(st)], If(rom(...)[pc(...)] >> 6 & 127 == 13, ~D(st), If(...[...] >> 6 & 127 == 49, ~A(st), If(... >> ... & 127 == 113, ~rom(...)[A(...)], If(... & ... == 15, -D(...), If(... == ..., -..., If(..., ..., ...)))))))))))) == 0, If(rom(st)[pc(st)] & 7 == 3, If(rom(st)[pc(st)] >> 6 & 127 == 42, 0, If(rom(st)[pc(st)] >> 6 & 127 == 63, 1, If(rom(st)[pc(st)] >> 6 & 127 == 58, 65535, If(rom(st)[pc(st)] >> 6 & 127 == 12, D(st), If(rom(st)[pc(st)] >> 6 & 127 == 48, A(st), If(rom(...)[pc(...)] >> 6 & 127 == 112, rom(st)[A(st)], If(...[...] >> 6 & 127 == 13, ~D(st), If(... >> ... & 127 == 49, ~A(st), If(... & ... == 113, ~...[...], If(... == ..., -..., If(..., ..., ...))))))))))) >= 0, If(rom(st)[pc(st)] & 7 == 4, If(rom(st)[pc(st)] >> 6 & 127 == 42, 0, If(rom(st)[pc(st)] >> 6 & 127 == 63, 1, If(rom(st)[pc(st)] >> 6 & 127 == 58, 65535, If(rom(st)[pc(st)] >> 6 & 127 == 12, D(st), If(rom(...)[pc(...)] >> 6 & 127 == 48, A(st), If(...[...] >> 6 & 127 == 112, rom(st)[A(st)], If(... >> ... & 127 == 13, ~D(st), If(... & ... == 49, ~A(...), If(... == ..., ~..., If(..., ..., ...)))))))))) < 0, If(rom(st)[pc(st)] & 7 == 5, If(rom(st)[pc(st)] >> 6 & 127 == 42, 0, If(rom(st)[pc(st)] >> 6 & ..., _subst_fun_body=If(rom(Var(0))[pc(Var(0))] >> 15 == 0, Nand2State(pc(Var(0)) + 1, rom(Var(0)), ram(Var(0)), D(Var(0)), rom(Var(0))[pc(Var(0))]), Nand2State(If(If(rom(Var(0))[pc(Var(0))] & 7 == 0, False, If(rom(Var(0))[pc(Var(0))] & 7 == 1, If(rom(Var(0))[pc(Var(0))] >> 6 & 127 == 42, 0, If(rom(Var(0))[pc(Var(0))] >> 6 & 127 == 63, 1, If(rom(Var(0))[pc(Var(0))] >> 6 & 127 == 58, 65535, If(rom(Var(0))[pc(Var(0))] >> 6 & 127 == 12, D(Var(0)), If(rom(Var(0))[pc(Var(0))] >> 6 & 127 == 48, A(Var(0)), If(rom(Var(0))[pc(Var(0))] >> 6 & 127 == 112, rom(Var(0))[A(Var(0))], If(rom(Var(0))[pc(Var(0))] >> 6 & 127 == 13, ~D(Var(0)), If(rom(Var(0))[pc(Var(0))] >> 6 & 127 == 49, ~A(Var(0)), If(rom(Var(0))[pc(Var(0))] >> 6 & 127 == 113, ~rom(Var(0))[A(Var(0))], If(rom(...)[pc(...)] >> 6 & 127 == 15, -D(Var(0)), If(...[...] >> 6 & 127 == 51, -A(Var(0)), If(... >> ... & 127 == 115, -rom(...)[A(...)], If(... & ... == 31, D(...) + 1, If(... == ..., ... + ..., If(..., ..., ...))))))))))))))) > 0, If(rom(Var(0))[pc(Var(0))] & 7 == 2, If(rom(Var(0))[pc(Var(0))] >> 6 & 127 == 42, 0, If(rom(Var(0))[pc(Var(0))] >> 6 & 127 == 63, 1, If(rom(Var(0))[pc(Var(0))] >> 6 & 127 == 58, 65535, If(rom(Var(0))[pc(Var(0))] >> 6 & 127 == 12, D(Var(0)), If(rom(Var(0))[pc(Var(0))] >> 6 & 127 == 48, A(Var(0)), If(rom(Var(0))[pc(Var(0))] >> 6 & 127 == 112, rom(Var(0))[A(Var(0))], If(rom(Var(0))[pc(Var(0))] >> 6 & 127 == 13, ~D(Var(0)), If(rom(Var(0))[pc(Var(0))] >> 6 & 127 == 49, ~A(Var(0)), If(rom(...)[pc(...)] >> 6 & 127 == 113, ~rom(Var(0))[A(Var(0))], If(...[...] >> 6 & 127 == 15, -D(Var(0)), If(... >> ... & 127 == 51, -A(Var(0)), If(... & ... == 115, -...[...], If(... == ..., ... + ..., If(..., ..., ...)))))))))))))) == 0, If(rom(Var(0))[pc(Var(0))] & 7 == 3, If(rom(Var(0))[pc(Var(0))] >> 6 & 127 == 42, 0, If(rom(Var(0))[pc(Var(0))] >> 6 & 127 == 63, 1, If(rom(Var(0))[pc(Var(0))] >> 6 & 127 == 58, 65535, If(rom(Var(0))[pc(Var(0))] >> 6 & 127 == 12, D(Var(0)), If(rom(Var(0))[pc(Var(0))] >> 6 & 127 == 48, A(Var(0)), If(rom(Var(0))[pc(Var(0))] >> 6 & 127 == 112, rom(Var(0))[A(Var(0))], If(rom(Var(0))[pc(Var(0))] >> 6 & 127 == 13, ~D(Var(0)), If(rom(...)[pc(...)] >> 6 & 127 == 49, ~A(Var(0)), If(...[...] >> 6 & 127 == 113, ~rom(Var(0))[A(Var(0))], If(... >> ... & 127 == 15, -D(Var(0)), If(... & ... == 51, -A(...), If(... == ..., -..., If(..., ..., ...))))))))))))) >= 0, If(rom(Var(0))[pc(Var(0))] & 7 == 4, If(rom(Var(0))[pc(Var(0))] >> 6 & 127 == 42, 0, If(rom(Var(0))[pc(Var(0))] >> 6 & 127 == 63, 1, If(rom(Var(0))[pc(Var(0))] >> 6 & 127 == 58, 65535, If(rom(Var(0))[pc(Var(0))] >> 6 & 127 == 12, ...), natpair: Unfolding(name='natpair', decl=natpair, args=[n!349, m!350], body=((n!349 + m!350)*(n!349 + m!350 + 1))/2 + m!350, ax=|= ForAll([n!302, m!312], natpair(n!302, m!312) == ((n!302 + m!312)*(n!302 + m!312 + 1))/2 + m!312), _subst_fun_body=((Var(0) + Var(1))*(Var(0) + Var(1) + 1))/2 + Var(1)), natpair_to_tuple: Unfolding(name='natpair_to_tuple', decl=natpair_to_tuple, args=[k!359], body=If(k!359 < 0, Tuple_Int_Int(-1, -1), If(k!359 == 0, Tuple_Int_Int(0, 0), If(_0(natpair_to_tuple(k!359 - 1)) == 0, Tuple_Int_Int(_1(natpair_to_tuple(k!359 - 1)) + 1, 0), Tuple_Int_Int(_0(natpair_to_tuple(k!359 - 1)) - 1, _1(natpair_to_tuple(k!359 - 1)) + 1)))), ax=|= ForAll(k!303, natpair_to_tuple(k!303) == If(k!303 < 0, Tuple_Int_Int(-1, -1), If(k!303 == 0, Tuple_Int_Int(0, 0), If(_0(natpair_to_tuple(k!303 - 1)) == 0, Tuple_Int_Int(_1(natpair_to_tuple(k!303 - 1)) + 1, 0), Tuple_Int_Int(_0(natpair_to_tuple(k!303 - 1)) - 1, _1(natpair_to_tuple(k!303 - 1)) + 1))))), _subst_fun_body=If(Var(0) < 0, Tuple_Int_Int(-1, -1), If(Var(0) == 0, Tuple_Int_Int(0, 0), If(_0(natpair_to_tuple(Var(0) - 1)) == 0, Tuple_Int_Int(_1(natpair_to_tuple(Var(0) - 1)) + 1, 0), Tuple_Int_Int(_0(natpair_to_tuple(Var(0) - 1)) - 1, _1(natpair_to_tuple(Var(0) - 1)) + 1))))), nested: Unfolding(name='nested', decl=nested, args=[An!2036], body=ForAll(n, subset(An!2036[n + 1], An!2036[n])), ax=|= ForAll(An, nested(An) == (ForAll(n, subset(An[n + 1], An[n])))), _subst_fun_body=ForAll(n, subset(Var(1)[n + 1], Var(1)[n]))), next: Unfolding(name='next', decl=next, args=[p!1165], body=T_Bool(Lambda(t!1164, val(p!1165)[t!1164 + 1])), ax=|= ForAll(p, next(p) == T_Bool(Lambda(t!1164, val(p)[t!1164 + 1]))), _subst_fun_body=T_Bool(Lambda(t!1164, val(Var(1))[t!1164 + 1]))), nonneg: Unfolding(name='nonneg', decl=nonneg, args=[x!527], body=absR(x!527) == x!527, ax=|= ForAll(x, nonneg(x) == (absR(x) == x)), _subst_fun_body=absR(Var(0)) == Var(0)), not1: Unfolding(name='not1', decl=not1, args=[x!768], body=nand1(x!768, x!768), ax=|= ForAll(x, not1(x) == nand1(x, x)), _subst_fun_body=nand1(Var(0), Var(0))), not2: Unfolding(name='not2', decl=not2, args=[x!783], body=Concat(not1(Extract(1, 1, x!783)), not1(Extract(0, 0, x!783))), ax=|= ForAll(x, not2(x) == Concat(not1(Extract(1, 1, x)), not1(Extract(0, 0, x)))), _subst_fun_body=Concat(not1(Extract(1, 1, Var(0))), not1(Extract(0, 0, Var(0))))), odd: Unfolding(name='odd', decl=odd, args=[x!273], body=Exists(y, x!273 == 2*y + 1), ax=|= ForAll(x, odd(x) == (Exists(y, x == 2*y + 1))), _subst_fun_body=Exists(y, Var(1) == 2*y + 1)), one: Unfolding(name='one', decl=one, args=[], body=1, ax=|= one == 1, _subst_fun_body=1), ones: Unfolding(name='ones', decl=ones, args=[n!2093], body=NDArray(Unit(n!2093), K(Int, 1)), ax=|= ForAll(n, ones(n) == NDArray(Unit(n), K(Int, 1))), _subst_fun_body=NDArray(Unit(Var(0)), K(Int, 1))), open_int: Unfolding(name='open_int', decl=open_int, args=[x!2010, y!2011], body=Lambda(z, And(x!2010 < z, z < y!2011)), ax=|= ForAll([x, y], open_int(x, y) == (Lambda(z, And(x < z, z < y)))), _subst_fun_body=Lambda(z, And(Var(1) < z, z < Var(2)))), or1: Unfolding(name='or1', decl=or1, args=[x!776, y!777], body=nand1(not1(x!776), not1(y!777)), ax=|= ForAll([x, y], or1(x, y) == nand1(not1(x), not1(y))), _subst_fun_body=nand1(not1(Var(0)), not1(Var(1)))), or2: Unfolding(name='or2', decl=or2, args=[x!791, y!792], body=Concat(or1(Extract(1, 1, x!791), Extract(1, 1, y!792)), or1(Extract(0, 0, x!791), Extract(0, 0, y!792))), ax=|= ForAll([x, y], or2(x, y) == Concat(or1(Extract(1, 1, x), Extract(1, 1, y)), or1(Extract(0, 0, x), Extract(0, 0, y)))), _subst_fun_body=Concat(or1(Extract(1, 1, Var(0)), Extract(1, 1, Var(1))), or1(Extract(0, 0, Var(0)), Extract(0, 0, Var(1))))), pair: Unfolding(name='pair', decl=pair, args=[n!371], body=from_nat(natpair(to_nat(n!371), to_nat(m!312))), ax=|= ForAll(n!302, pair(n!302) == from_nat(natpair(to_nat(n!302), to_nat(m!312)))), _subst_fun_body=from_nat(natpair(to_nat(Var(0)), to_nat(m!312)))), pair: Unfolding(name='pair', decl=pair, args=[a!2558, b!2559], body=upair(ZF.sing(a!2558), upair(a!2558, b!2559)), ax=|= ForAll([a!2163, b!2164], pair(a!2163, b!2164) == upair(ZF.sing(a!2163), upair(a!2163, b!2164))), _subst_fun_body=upair(ZF.sing(Var(0)), upair(Var(0), Var(1)))), perp: Unfolding(name='perp', decl=perp, args=[u!2139, v!2140], body=Vec3.dot(u!2139, v!2140) == 0, ax=|= ForAll([u, v], perp(u, v) == (Vec3.dot(u, v) == 0)), _subst_fun_body=Vec3.dot(Var(0), Var(1)) == 0), pick: Unfolding(name='pick', decl=pick, args=[a!2188], body=f!2187(a!2188), ax=|= ForAll(a!2163, pick(a!2163) == f!2187(a!2163)), _subst_fun_body=f!2187(Var(0))), pos: Unfolding(name='pos', decl=pos, args=[a!1282], body=Lambda(i, If(i >= 0, a!1282[i], 0)), ax=|= ForAll(a, pos(a) == (Lambda(i, If(i >= 0, a[i], 0)))), _subst_fun_body=Lambda(i, If(i >= 0, Var(1)[i], 0))), pow: Unfolding(name='pow', decl=pow, args=[x!601, y!602], body=x!601**y!602, ax=|= ForAll([x, y], pow(x, y) == x**y), _subst_fun_body=Var(0)**Var(1)), powers: Unfolding(name='powers', decl=powers, args=[x!1558], body=Lambda(i, If(i == 0, 1, If(i < 0, powers(x!1558)[i + 1]/x!1558, x!1558*powers(x!1558)[i - 1]))), ax=|= ForAll(x, powers(x) == (Lambda(i, If(i == 0, 1, If(i < 0, powers(x)[i + 1]/x, x*powers(x)[i - 1]))))), _subst_fun_body=Lambda(i, If(i == 0, 1, If(i < 0, powers(Var(1))[i + 1]/Var(1), Var(1)*powers(Var(1))[i - 1])))), pownat: Unfolding(name='pownat', decl=pownat, args=[x!610, n!611], body=If(n!611 == 0, 1, If(n!611 > 0, x!610*pownat(x!610, n!611 - 1), pownat(x!610, n!611 + 1)/x!610)), ax=|= ForAll([x, n], pownat(x, n) == If(n == 0, 1, If(n > 0, x*pownat(x, n - 1), pownat(x, n + 1)/x))), _subst_fun_body=If(Var(1) == 0, 1, If(Var(1) > 0, Var(0)*pownat(Var(0), Var(1) - 1), pownat(Var(0), Var(1) + 1)/Var(0)))), prime: Unfolding(name='prime', decl=prime, args=[n!298], body=And(n!298 > 1, Not(Exists([p, q], And(p > 1, q > 1, n!298 == p*q)))), ax=|= ForAll(n, prime(n) == And(n > 1, Not(Exists([p, q], And(p > 1, q > 1, n == p*q))))), _subst_fun_body=And(Var(0) > 1, Not(Exists([p, q], And(p > 1, q > 1, Var(2) == p*q))))), prod: Unfolding(name='prod', decl=prod, args=[A!2615, B!2616], body=sep(pow(pow(union(A!2615, B!2616))), Lambda(p!2167, Exists([x, y], And(And(∈(x, A!2615), ∈(y, B!2616)), p!2167 == pair(x, y))))), ax=|= ForAll([A, B], prod(A, B) == sep(pow(pow(union(A, B))), Lambda(p!2167, Exists([x, y], And(And(∈(x, A), ∈(y, B)), p!2167 == pair(x, y)))))), _subst_fun_body=sep(pow(pow(union(Var(0), Var(1)))), Lambda(p!2167, Exists([x, y], And(And(∈(x, Var(3)), ∈(y, Var(4))), p!2167 == pair(x, y)))))), ran: Unfolding(name='ran', decl=ran, args=[R!2690], body=sep(bigunion(bigunion(R!2690)), Lambda(y, Exists(x, ∈(pair(x, y), R!2690)))), ax=|= ForAll(R, ran(R) == sep(bigunion(bigunion(R)), Lambda(y, Exists(x, ∈(pair(x, y), R))))), _subst_fun_body=sep(bigunion(bigunion(Var(0))), Lambda(y, Exists(x, ∈(pair(x, y), Var(2)))))), reflects: Unfolding(name='reflects', decl=reflects, args=[P!2169, A!2170], body=ForAll(x, ∈(x, A!2170) == P!2169[x]), ax=|= ForAll([P, A], reflects(P, A) == (ForAll(x, ∈(x, A) == P[x]))), _subst_fun_body=ForAll(x, ∈(x, Var(2)) == Var(1)[x])), rseq.abs: Unfolding(name='rseq.abs', decl=rseq.abs, args=[a!1473], body=Map(absR, a!1473), ax=|= ForAll(a, rseq.abs(a) == Map(absR, a)), _subst_fun_body=Map(absR, Var(0))), rseq.cos: Unfolding(name='rseq.cos', decl=rseq.cos, args=[a!1472], body=Map(Real.cos, a!1472), ax=|= ForAll(a, rseq.cos(a) == Map(Real.cos, a)), _subst_fun_body=Map(Real.cos, Var(0))), rseq.dot: Unfolding(name='rseq.dot', decl=rseq.dot, args=[n!1438, a!1439, b!1440], body=finsum((Array Int Real).mul(a!1439, b!1440), n!1438), ax=|= ForAll([n, a, b], rseq.dot(n, a, b) == finsum((Array Int Real).mul(a, b), n)), _subst_fun_body=finsum((Array Int Real).mul(Var(1), Var(2)), Var(0))), rseq.outer: Unfolding(name='rseq.outer', decl=rseq.outer, args=[a!1468, b!1469], body=Lambda([i, j], a!1468[i]*b!1469[j]), ax=|= ForAll([a, b], rseq.outer(a, b) == (Lambda([i, j], a[i]*b[j]))), _subst_fun_body=Lambda([i, j], Var(2)[i]*Var(3)[j])), rseq.sin: Unfolding(name='rseq.sin', decl=rseq.sin, args=[a!1471], body=Map(Real.sin, a!1471), ax=|= ForAll(a, rseq.sin(a) == Map(Real.sin, a)), _subst_fun_body=Map(Real.sin, Var(0))), safe_pred: Unfolding(name='safe_pred', decl=safe_pred, args=[n!372], body=If(is(Z, n!372), Z, pred(n!372)), ax=|= ForAll(n, safe_pred(n) == If(is(Z, n), Z, pred(n))), _subst_fun_body=If(is(Z, Var(0)), Z, pred(Var(0)))), search: Unfolding(name='search', decl=search, args=[P!325, n!326], body=If(P!325[n!326], n!326, If(P!325[-n!326], -n!326, If(P!325[n!326 + 1], 1, 0))), ax=|= ForAll([P, n!302], search(P, n!302) == If(P[n!302], n!302, If(P[-n!302], -n!302, If(P[n!302 + 1], 1, 0)))), _subst_fun_body=If(Var(0)[Var(1)], Var(1), If(Var(0)[-Var(1)], -Var(1), If(Var(0)[Var(1) + 1], 1, 0)))), sgn: Unfolding(name='sgn', decl=sgn, args=[x!464], body=If(x!464 > 0, 1, If(x!464 < 0, -1, 0)), ax=|= ForAll(x, sgn(x) == If(x > 0, 1, If(x < 0, -1, 0))), _subst_fun_body=If(Var(0) > 0, 1, If(Var(0) < 0, -1, 0))), shift: Unfolding(name='shift', decl=shift, args=[A!2014, c!2015], body=Lambda(x, A!2014[x - c!2015]), ax=|= ForAll([A, c], shift(A, c) == (Lambda(x, A[x - c]))), _subst_fun_body=Lambda(x, Var(1)[x - Var(2)])), snd: Unfolding(name='snd', decl=snd, args=[p!2562], body=If(ZF.sing(ZF.sing(fst(p!2562))) == p!2562, fst(p!2562), pick(ZFSet.sub(bigunion(p!2562), ZF.sing(fst(p!2562))))), ax=|= ForAll(p!2167, snd(p!2167) == If(ZF.sing(ZF.sing(fst(p!2167))) == p!2167, fst(p!2167), pick(ZFSet.sub(bigunion(p!2167), ZF.sing(fst(p!2167)))))), _subst_fun_body=If(ZF.sing(ZF.sing(fst(Var(0)))) == Var(0), fst(Var(0)), pick(ZFSet.sub(bigunion(Var(0)), ZF.sing(fst(Var(0))))))), sub: Unfolding(name='sub', decl=sub, args=[x!447, y!448], body=x!447 - y!448, ax=|= ForAll([x, y], sub(x, y) == x - y), _subst_fun_body=Var(0) - Var(1)), tan: Unfolding(name='tan', decl=tan, args=[x!675], body=Real.sin(x!675)/Real.cos(x!675), ax=|= ForAll(x, tan(x) == Real.sin(x)/Real.cos(x)), _subst_fun_body=Real.sin(Var(0))/Real.cos(Var(0))), tand: Unfolding(name='tand', decl=tand, args=[p!1150, q!1151], body=T_Bool(Lambda(t!1149, And(val(p!1150)[t!1149], val(q!1151)[t!1149]))), ax=|= ForAll([p, q], tand(p, q) == T_Bool(Lambda(t!1149, And(val(p)[t!1149], val(q)[t!1149])))), _subst_fun_body=T_Bool(Lambda(t!1149, And(val(Var(1))[t!1149], val(Var(2))[t!1149])))), temp.valid: Unfolding(name='temp.valid', decl=temp.valid, args=[p!1169], body=val(p!1169)[0], ax=|= ForAll(p, temp.valid(p) == val(p)[0]), _subst_fun_body=val(Var(0))[0]), timpl: Unfolding(name='timpl', decl=timpl, args=[p!1156, q!1157], body=T_Bool(Lambda(t!1155, Implies(val(p!1156)[t!1155], val(q!1157)[t!1155]))), ax=|= ForAll([p, q], timpl(p, q) == T_Bool(Lambda(t!1155, Implies(val(p)[t!1155], val(q)[t!1155])))), _subst_fun_body=T_Bool(Lambda(t!1155, Implies(val(Var(1))[t!1155], val(Var(2))[t!1155])))), tint: Unfolding(name='tint', decl=tint, args=[x!1205], body=T_Int(K(Int, x!1205)), ax=|= ForAll(x, tint(x) == T_Int(K(Int, x))), _subst_fun_body=T_Int(K(Int, Var(0)))), tnot: Unfolding(name='tnot', decl=tnot, args=[p!1148], body=T_Bool(Lambda(t!1147, Not(val(p!1148)[t!1147]))), ax=|= ForAll(p, tnot(p) == T_Bool(Lambda(t!1147, Not(val(p)[t!1147])))), _subst_fun_body=T_Bool(Lambda(t!1147, Not(val(Var(1))[t!1147])))), to_int: Unfolding(name='to_int', decl=to_int, args=[n!374], body=If(is(Z, n!374), 0, 1 + to_int(pred(n!374))), ax=|= ForAll(n, to_int(n) == If(is(Z, n), 0, 1 + to_int(pred(n)))), _subst_fun_body=If(is(Z, Var(0)), 0, 1 + to_int(pred(Var(0))))), to_nat: Unfolding(name='to_nat', decl=to_nat, args=[n!341], body=If(n!341 >= 0, n!341*2, n!341*-2 - 1), ax=|= ForAll(n!302, to_nat(n!302) == If(n!302 >= 0, n!302*2, n!302*-2 - 1)), _subst_fun_body=If(Var(0) >= 0, Var(0)*2, Var(0)*-2 - 1)), tor: Unfolding(name='tor', decl=tor, args=[p!1153, q!1154], body=T_Bool(Lambda(t!1152, Or(val(p!1153)[t!1152], val(q!1154)[t!1152]))), ax=|= ForAll([p, q], tor(p, q) == T_Bool(Lambda(t!1152, Or(val(p)[t!1152], val(q)[t!1152])))), _subst_fun_body=T_Bool(Lambda(t!1152, Or(val(Var(1))[t!1152], val(Var(2))[t!1152])))), union: Unfolding(name='union', decl=union, args=[A!2264, B!2265], body=bigunion(upair(A!2264, B!2265)), ax=|= ForAll([A, B], union(A, B) == bigunion(upair(A, B))), _subst_fun_body=bigunion(upair(Var(0), Var(1)))), upper_bound: Unfolding(name='upper_bound', decl=upper_bound, args=[A!1683, x!1684], body=ForAll(y, Implies(A!1683[y], EReal.le(y, x!1684))), ax=|= ForAll([A, x], upper_bound(A, x) == (ForAll(y, Implies(A[y], EReal.le(y, x))))), _subst_fun_body=ForAll(y, Implies(Var(1)[y], EReal.le(y, Var(2))))), valid: Unfolding(name='valid', decl=valid, args=[a!1101], body=ForAll(w, val(a!1101)[w]), ax=|= ForAll(a, valid(a) == (ForAll(w, val(a)[w]))), _subst_fun_body=ForAll(w, val(Var(1))[w])), where: Unfolding(name='where', decl=where, args=[mask!1276, a!1277, b!1278], body=Lambda(i, If(mask!1276[i], a!1277[i], b!1278[i])), ax=|= ForAll([mask, a, b], where(mask, a, b) == (Lambda(i, If(mask[i], a[i], b[i])))), _subst_fun_body=Lambda(i, If(Var(1)[i], Var(2)[i], Var(3)[i]))), width: Unfolding(name='width', decl=width, args=[i!1810], body=hi(i!1810) - lo(i!1810), ax=|= ForAll(i, width(i) == hi(i) - lo(i)), _subst_fun_body=hi(Var(0)) - lo(Var(0))), zero: Unfolding(name='zero', decl=zero, args=[n!2092], body=NDArray(Unit(n!2092), K(Int, 0)), ax=|= ForAll(n, zero(n) == NDArray(Unit(n), K(Int, 0))), _subst_fun_body=NDArray(Unit(Var(0)), K(Int, 0)))}
defn holds definitional axioms for function symbols.
- kdrag.kernel.ext(domain: Sequence[SortRef], range_: SortRef) Proof
>>> ext([smt.IntSort()], smt.IntSort()) |= ForAll([f, g], (f == g) == (ForAll(x0, f[x0] == g[x0]))) >>> ext([smt.IntSort(), smt.RealSort()], smt.IntSort()) |= ForAll([f, g], (f == g) == (ForAll([x0, x1], Select(f, x0, x1) == Select(g, x0, x1))))
- Parameters:
domain (Sequence[SortRef])
range_ (SortRef)
- Return type:
- kdrag.kernel.forget(ts: Sequence[ExprRef], thm: QuantifierRef) Proof
“Forget” a term using existentials. This is existential introduction. P(ts) -> exists xs, P(xs) thm is an existential formula, and ts are terms to substitute those variables with. forget easily follows. https://en.wikipedia.org/wiki/Existential_generalization
- Parameters:
ts (Sequence[ExprRef])
thm (QuantifierRef)
- Return type:
- kdrag.kernel.free_vars(e: ExprRef) set[ExprRef]
Get an overapproximation of free variables in a term. This is used for skolemization.
>>> x,y = smt.Ints("x y") >>> z = FreshVar("z", smt.IntSort()) >>> assert z in free_vars(x + y + z)
- Parameters:
e (ExprRef)
- Return type:
set[ExprRef]
- kdrag.kernel.fresh_const(q: QuantifierRef, prefixes=None) list[ExprRef]
Generate fresh constants of same sort as quantifier.
- Parameters:
q (QuantifierRef)
- Return type:
list[ExprRef]
- kdrag.kernel.generalize(vs: list[ExprRef], pf: Proof) Proof
Generalize a theorem with respect to a list of schema variables. This introduces a universal quantifier for schema variables.
>>> x = FreshVar("x", smt.IntSort()) >>> y = FreshVar("y", smt.IntSort()) >>> generalize([x, y], prove(x == x)) |= ForAll([x!..., y!...], x!... == x!...)
- kdrag.kernel.herb(thm: QuantifierRef, prefixes=None) tuple[list[ExprRef], Proof]
Herbrandize a theorem. It is sufficient to prove a theorem for fresh consts to prove a universal. Note: Perhaps lambdaized form is better? Return vars and lamda that could receive |= P[vars]
>>> x = smt.Int("x") >>> herb(smt.ForAll([x], x >= x)) ([x!...], |= Implies(x!... >= x!..., ForAll(x, x >= x)))
- Parameters:
thm (QuantifierRef)
- Return type:
tuple[list[ExprRef], Proof]
- kdrag.kernel.induct_inductive(x: DatatypeRef, P: QuantifierRef) Proof
Build a basic induction principle for an algebraic datatype
- Parameters:
x (DatatypeRef)
P (QuantifierRef)
- Return type:
- kdrag.kernel.instan(ts: Sequence[ExprRef], pf: Proof) Proof
Instantiate a universally quantified formula. This is forall elimination
- kdrag.kernel.is_declared(e: ExprRef | FuncDeclRef) bool
- Parameters:
e (ExprRef | FuncDeclRef)
- Return type:
bool
- kdrag.kernel.is_defined(x: ExprRef) bool
Determined if expression head is in definitions.
- Parameters:
x (ExprRef)
- Return type:
bool
- kdrag.kernel.is_fresh_var(v: ExprRef) bool
Check if a variable is a schema variable. Schema variables are generated by FreshVar and have a _FreshVarEvidence attribute.
>>> is_fresh_var(FreshVar("x", smt.IntSort())) True
- Parameters:
v (ExprRef)
- Return type:
bool
- kdrag.kernel.make_unfolding(pf: Proof) Unfolding
Take an axiom of the form |= forall x0 x1 …, xn, f(x0, x1, …, xn) = body and return a Defn object for f. Unfolding judgments can be used with unfold_defns.
>>> x,y,z = smt.Ints("x y z") >>> pf = kd.prove(smt.ForAll([x,y], x + y == y + x + 0)) # has shape of definition, but not "definitional" >>> defn = make_unfolding(pf) >>> unfold_defns(z + 42, [defn]) (42 + z + 0, |= z + 42 == 42 + z + 0)
- kdrag.kernel.modus(ab: Proof, a: Proof) Proof
Modus ponens for implies and equality.
>>> a,b = smt.Bools("a b") >>> ab = axiom(smt.Implies(a, b)) >>> a = axiom(a) >>> modus(ab, a) |= b >>> ab1 = axiom(smt.Eq(a.thm, b)) >>> modus(ab1, a) |= b
- kdrag.kernel.obtain(thm: QuantifierRef) tuple[list[ExprRef], Proof]
Skolemize an existential quantifier. exists xs, P(xs) -> P(cs) for fresh cs https://en.wikipedia.org/wiki/Existential_instantiation
>>> x = smt.Int("x") >>> obtain(smt.Exists([x], x >= 0)) ([x!...], |= Implies(Exists(x, x >= 0), x!... >= 0)) >>> y = FreshVar("y", smt.IntSort()) >>> obtain(smt.Exists([x], x >= y)) ([f!...(y!...)], |= Implies(Exists(x, x >= y!...), f!...(y!...) >= y!...))
- Parameters:
thm (QuantifierRef)
- Return type:
tuple[list[ExprRef], Proof]
- kdrag.kernel.open_binder(lam: QuantifierRef) tuple[list[ExprRef], ExprRef]
Open a quantifier with fresh variables. This achieves the locally nameless representation https://chargueraud.org/research/2009/ln/main.pdf where it is harder to go wrong.
The variables are schema variables which when used in a proof may be generalized
>>> x = smt.Int("x") >>> open_binder(smt.ForAll([x], x > 0)) ([x!...], x!... > 0)
- Parameters:
lam (QuantifierRef)
- Return type:
tuple[list[ExprRef], ExprRef]
- kdrag.kernel.prove(thm: BoolRef, by: Proof | Iterable[Proof] = [], admit=False, timeout=1000, dump=False, solver=None, fvs=frozenset({})) Proof
Prove a theorem using a list of previously proved lemmas.
In essence prove(Implies(by, thm)).
- Parameters:
thm (smt.BoolRef) – The theorem to prove.
thm – The theorem to prove.
by (list[Proof]) – A list of previously proved lemmas.
admit (bool) – If True, admit the theorem without proof.
- Returns:
A proof object of thm
- Return type:
>>> prove(smt.BoolVal(True)) |= True >>> prove(smt.RealVal(1) >= smt.RealVal(0)) |= 1 >= 0
- kdrag.kernel.register_definition(defn: Unfolding)
Can register other unfoldings besides those generated by define. This may be useful to get unfolding for objects constructed in roundabout ays.
- Parameters:
defn (Unfolding)
- kdrag.kernel.rename_vars2(pf: Proof, vs: list[ExprRef], patterns=[], no_patterns=[]) Proof
Rename bound variables and also attach triggers
>>> x,y = smt.Ints("x y") >>> f = smt.Function("f", smt.IntSort(), smt.IntSort()) >>> rename_vars2(kd.prove(smt.ForAll([x, y], x + 1 > x)), [y,x], patterns=[x+y]) |= ForAll([y, x], y + 1 > y) >>> rename_vars2(kd.prove(smt.Exists([x], x + 1 > y)), [y]) Traceback (most recent call last): ... ValueError: ('Cannot rename vars to ones that already occur in term', [y], Exists(x, x + 1 > y))
- kdrag.kernel.specialize(ts: Sequence[ExprRef], thm: BoolRef) Proof
Instantiate a universally quantified formula forall xs, P(xs) -> P(ts) This is forall elimination
- Parameters:
ts (Sequence[ExprRef])
thm (BoolRef)
- Return type:
- kdrag.kernel.subst(t: ExprRef, eqs: Sequence[Proof]) tuple[ExprRef, Proof]
Substitute using equality proofs
>>> x, y = smt.Ints("x y") >>> eq = kd.prove(x == ((x + 1) - 1)) >>> subst(x + 3, [eq]) (x + 1 - 1 + 3, |= x + 3 == x + 1 - 1 + 3)
- kdrag.kernel.trigger(pf: Proof, patterns: list[ExprRef] = [], no_patterns: list[ExprRef] = []) Proof
Add e-matching triggers to a quantified proof. Logically speaking, does nothing.
>>> x,y = smt.Ints("x y") >>> p = kd.prove(smt.ForAll([x,y], y > 0, x + y > x)) >>> p.thm.num_patterns() 0 >>> p2 = trigger(p, patterns=[x + y]) >>> p2 |= ForAll([x, y], Implies(y > 0, x + y > x)) >>> p2.thm.pattern(0) Var(1) + Var(0)
- kdrag.kernel.unfold(e: ExprRef, decls: Sequence[FuncDeclRef]) tuple[ExprRef, Proof]
Unfold function definitions in an expression.
>>> x,y = smt.Ints("x y") >>> f = define("f", [x,y], x + 2*y) >>> g = define("g", [x,y], f(x,y) + 1) >>> unfold(f(42,13) + g(7,8), [f]) (42 + 2*13 + g(7, 8), |= f(42, 13) + g(7, 8) == 42 + 2*13 + g(7, 8)) >>> unfold(f(42,13) + g(7,8), [f,g]) (42 + 2*13 + f(7, 8) + 1, |= f(42, 13) + g(7, 8) == 42 + 2*13 + f(7, 8) + 1)
- Parameters:
e (ExprRef)
decls (Sequence[FuncDeclRef])
- Return type:
tuple[ExprRef, Proof]