kdrag.kernel

The kernel hold core proof datatypes and core inference rules. By and large, all proofs must flow through this module.

Module Attributes

defns

defn holds definitional axioms for function symbols.

Functions

FreshVar(prefix, sort)

Generate a fresh variable.

Inductive(name[, ctx, auto_fresh])

Declare datatypes with auto generated induction principles.

andI(pfs)

Prove an and from two kd.Proofs of its conjuncts.

axiom(thm[, fvs, by])

Assert an axiom.

choose(pf)

Convert a theorem of the form `|= forall xs, exists y0 y1.

compose(ab, bc)

Compose two implications.

decl_occurs(f, body)

Check if symbol f appears in body.

declare(name, *sorts)

Reserve a name.

define(name, args, body)

Define a non recursive definition.

define_fix(name, args, retsort, fix_lam)

Define a recursive definition.

define_simple(name, args, body)

A simple non recursive definition is a conservative extension https://en.wikipedia.org/wiki/Conservative_extension

ext(domain, range_)

forget(ts, thm)

"Forget" a term using existentials.

free_vars(e)

Get an overapproximation of free variables in a term.

fresh_const(q[, prefixes])

Generate fresh constants of same sort as quantifier.

generalize(vs, pf)

Generalize a theorem with respect to a list of schema variables.

herb(thm[, prefixes])

Herbrandize a theorem.

induct_inductive(x, P)

Build a basic induction principle for an algebraic datatype

instan(ts, pf)

Instantiate a universally quantified formula.

is_declared(e)

is_defined(x)

Determined if expression head is in definitions.

is_fresh_var(v)

Check if a variable is a schema variable.

is_proof(p)

make_unfolding(pf)

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(ab, a)

Modus ponens for implies and equality.

obtain(thm)

Skolemize an existential quantifier.

open_binder(lam)

Open a quantifier with fresh variables.

prove(thm[, by, admit, timeout, dump, ...])

Prove a theorem using a list of previously proved lemmas.

register_definition(defn)

Can register other unfoldings besides those generated by define.

rename_vars2(pf, vs[, patterns, no_patterns])

Rename bound variables and also attach triggers

specialize(ts, thm)

Instantiate a universally quantified formula forall xs, P(xs) -> P(ts) This is forall elimination

subst(t, eqs)

Substitute using equality proofs

trigger(pf[, patterns, no_patterns])

Add e-matching triggers to a quantified proof.

unfold(e, decls)

Unfold function definitions in an expression.

unfold_defns(e, defns)

Unfold definitions in an expression.

weaken(pf, fvs)

Classes

Judgement()

Judgements should be constructed by smart constructors.

Proof(fvs, thm, reason[, admit])

It is unlikely that users should be accessing the Proof constructor directly.

Unfolding(name, decl, args, body, ax, ...)

A record storing definition.

Exceptions

LemmaError

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: object

Judgements 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: Judgement

It 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:

Proof

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: Judgement

A 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]
ax: Proof
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))
Parameters:

pfs (Sequence[Proof])

Return type:

Proof

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:

Proof

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!...))
Parameters:

pf (Proof)

Return type:

tuple[list[FuncDeclRef], Proof]

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)
Parameters:
Return type:

Proof

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!1091], body=Exists(finwit!1090,        ForAll(x!1089,               A!1091[x!1089] ==               Contains(finwit!1090, Unit(x!1089)))), ax=|= ForAll(A,        (Array (Array Sierpinski Bool) Bool).finite(A) ==        (Exists(finwit!1090,                ForAll(x!1089,                       A[x!1089] ==                       Contains(finwit!1090, Unit(x!1089)))))), _subst_fun_body=Exists(finwit!1090,        ForAll(x!1089,               Var(2)[x!1089] ==               Contains(finwit!1090, Unit(x!1089))))), (Array Bool Bool).choose: Unfolding(name='(Array Bool Bool).choose', decl=(Array Bool Bool).choose, args=[P!291], body=If(P!291[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!128], body=Exists(finwit!127,        ForAll(x!126,               A!128[x!126] ==               Contains(finwit!127, Unit(x!126)))), ax=|= ForAll(A,        (Array Bool Bool).finite(A) ==        (Exists(finwit!127,                ForAll(x!126,                       A[x!126] ==                       Contains(finwit!127, Unit(x!126)))))), _subst_fun_body=Exists(finwit!127,        ForAll(x!126,               Var(2)[x!126] ==               Contains(finwit!127, Unit(x!126))))), (Array EReal Bool).finite: Unfolding(name='(Array EReal Bool).finite', decl=(Array EReal Bool).finite, args=[A!1812], body=Exists(finwit!1811,        ForAll(x!1810,               A!1812[x!1810] ==               Contains(finwit!1811, Unit(x!1810)))), ax=|= ForAll(A,        (Array EReal Bool).finite(A) ==        (Exists(finwit!1811,                ForAll(x!1810,                       A[x!1810] ==                       Contains(finwit!1811, Unit(x!1810)))))), _subst_fun_body=Exists(finwit!1811,        ForAll(x!1810,               Var(2)[x!1810] ==               Contains(finwit!1811, Unit(x!1810))))), (Array Int Bool).choose: Unfolding(name='(Array Int Bool).choose', decl=(Array Int Bool).choose, args=[P!412], body=search(P!412, 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!72], body=Exists(finwit!71,        ForAll(x!70,               A!72[x!70] == Contains(finwit!71, Unit(x!70)))), ax=|= ForAll(A,        (Array Int Bool).finite(A) ==        (Exists(finwit!71,                ForAll(x!70,                       A[x!70] ==                       Contains(finwit!71, Unit(x!70)))))), _subst_fun_body=Exists(finwit!71,        ForAll(x!70,               Var(2)[x!70] ==               Contains(finwit!71, Unit(x!70))))), (Array Int C).add: Unfolding(name='(Array Int C).add', decl=(Array Int C).add, args=[a!1725, b!1726], body=Lambda(i, C.add(a!1725[i], b!1726[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!1738, b!1739], body=Lambda(i, C.mul(a!1738[i], b!1739[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!1474, b!1475], body=Lambda(i, a!1474[i] + b!1475[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!1491, b!1492], body=Lambda(i, a!1491[i]/b!1492[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!1482, b!1483], body=Lambda(i, a!1482[i]*b!1483[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!1493], body=Lambda(i, -a!1493[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!1480, b!1481], body=Lambda(i, a!1480[i] - b!1481[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!517, g!518], body=Lambda(x, f!517[x] + g!518[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!523, g!524], body=Lambda(x, f!523[x]/g!524[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!521, g!522], body=Lambda(x, f!521[x]*g!522[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!519, g!520], body=Lambda(x, f!519[x] - g!520[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!1035], body=Exists(finwit!1034,        ForAll(x!1033,               A!1035[x!1033] ==               Contains(finwit!1034, Unit(x!1033)))), ax=|= ForAll(A,        (Array Sierpinski Bool).finite(A) ==        (Exists(finwit!1034,                ForAll(x!1033,                       A[x!1033] ==                       Contains(finwit!1034, Unit(x!1033)))))), _subst_fun_body=Exists(finwit!1034,        ForAll(x!1033,               Var(2)[x!1033] ==               Contains(finwit!1034, Unit(x!1033))))), (Array Sierpinski Bool).open: Unfolding(name='(Array Sierpinski Bool).open', decl=(Array Sierpinski Bool).open, args=[A!1119], body=Or(A!1119 == K(Sierpinski, False),    A!1119 == K(Sierpinski, True),    A!1119 == 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!1924], body=Exists(finwit!1923,        ForAll(x!1922,               A!1924[x!1922] ==               Contains(finwit!1923, Unit(x!1922)))), ax=|= ForAll(A,        (Array Vec2 Bool).finite(A) ==        (Exists(finwit!1923,                ForAll(x!1922,                       A[x!1922] ==                       Contains(finwit!1923, Unit(x!1922)))))), _subst_fun_body=Exists(finwit!1923,        ForAll(x!1922,               Var(2)[x!1922] ==               Contains(finwit!1923, Unit(x!1922))))), Atom.fresh: Unfolding(name='Atom.fresh', decl=Atom.fresh, args=[x!1329, a!1330], body=a!1330 != x!1329, 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!1331, a!1332, b!1333], body=If(x!1331 == a!1332,    b!1333,    If(x!1331 == b!1333, a!1332, x!1331)), 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!259], body=If(Length(val(x!259)) == 0,    0,    BV2Int(Nth(val(x!259), 0)) +    2*    BitVecN.to_int(BitVecN(seq.extract(val(x!259),                                       1,                                       Length(val(x!259)) - 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!1437], body=C.mul(z!1437, conj(z!1437)), 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!1752], body=Lambda(i, C(_0(ab!1752)[i], _1(ab!1752)[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!1751], body=Tuple_Array_Array(Lambda(i, re(a!1751[i])),                   Lambda(i, im(a!1751[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!1844], body=Implies(is(real, x!1844), val(x!1844) >= 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!1771, y!1772], body=If(And(is(Real, x!1771), is(Real, y!1772)),    Real(val(x!1771) + val(y!1772)),    If(And(is(Inf, x!1771), Not(is(NegInf, y!1772))),       Inf,       If(And(Not(is(NegInf, x!1771)), is(Inf, y!1772)),          Inf,          If(And(is(NegInf, x!1771), Not(is(Inf, y!1772))),             NegInf,             If(And(Not(is(Inf, x!1771)), is(NegInf, y!1772)),                NegInf,                add_undef(x!1771, y!1772)))))), 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!1761, y!1762], body=If(x!1761 == y!1762,    True,    If(is(NegInf, x!1761),       True,       If(is(Inf, y!1762),          True,          If(is(NegInf, y!1762),             False,             If(is(Inf, x!1761),                False,                If(And(is(Real, x!1761), is(Real, y!1762)),                   val(x!1761) <= val(y!1762),                   unreachable!1760)))))), 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!1760))))))), _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!1760))))))), Interval.add: Unfolding(name='Interval.add', decl=Interval.add, args=[i!2068, j!2069], body=Interval(lo(i!2068) + lo(j!2069), hi(i!2068) + hi(j!2069)), 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!2082, J!2083], body=Interval(If(And(hi(I!2082)*hi(J!2083) <=                 lo(I!2082)*lo(J!2083),                 hi(I!2082)*hi(J!2083) <=                 hi(I!2082)*lo(J!2083),                 hi(I!2082)*hi(J!2083) <=                 lo(I!2082)*hi(J!2083)),             hi(I!2082)*hi(J!2083),             If(And(lo(I!2082)*lo(J!2083) <=                    hi(I!2082)*lo(J!2083),                    lo(I!2082)*lo(J!2083) <=                    lo(I!2082)*hi(J!2083)),                lo(I!2082)*lo(J!2083),                If(And(hi(I!2082)*lo(J!2083) <=                       lo(I!2082)*hi(J!2083)),                   hi(I!2082)*lo(J!2083),                   lo(I!2082)*hi(J!2083)))),          If(And(hi(I!2082)*hi(J!2083) >=                 lo(I!2082)*lo(J!2083),                 hi(I!2082)*hi(J!2083) >=                 hi(I!2082)*lo(J!2083),                 hi(I!2082)*hi(J!2083) >=                 lo(I!2082)*hi(J!2083)),             hi(I!2082)*hi(J!2083),             If(And(lo(I!2082)*lo(J!2083) <=                    hi(I!2082)*lo(J!2083),                    lo(I!2082)*lo(J!2083) <=                    lo(I!2082)*hi(J!2083)),                lo(I!2082)*lo(J!2083),                If(And(hi(I!2082)*lo(J!2083) <=                       lo(I!2082)*hi(J!2083)),                   hi(I!2082)*lo(J!2083),                   lo(I!2082)*hi(J!2083))))), 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!2052], body=Lambda(x, And(lo(i!2052) <= x, x <= hi(i!2052))), 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!2075, j!2076], body=Interval(lo(i!2075) - hi(j!2076), hi(i!2075) - lo(j!2076)), 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!815, y!816], body=KnownBits_1(ones(x!815) & ones(y!816),             ~(~unknowns(x!815) & ~ones(x!815) |               ~unknowns(y!816) & ~ones(y!816) |               ones(x!815) & ones(y!816))), 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!781], body=KnownBits_1(a!781, 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!806], body=KnownBits_1(~unknowns(x!806) & ~ones(x!806),             unknowns(x!806)), 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!782], body=unknowns(x!782) == 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!833, y!834], body=KnownBits_1(ones(x!833) | ones(y!834),             ~(ones(x!833) |               ones(y!834) |               ~unknowns(x!833) &               ~ones(x!833) &               ~unknowns(y!834) &               ~ones(y!834))), 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!779], body=Lambda(a, ~unknowns(x!779) & a == ones(x!779)), 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!780], body=ones(x!780) & unknowns(x!780) == 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!805], body=~unknowns(x!805) & ~ones(x!805), 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!2340, v!2341], body=If(shape(u!2340) == shape(v!2341),    NDArray(shape(u!2340),            Lambda(k, data(u!2340)[k] + data(v!2341)[k])),    add_undef(u!2340, v!2341)), 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!481, y!482], body=If(is(Z, x!481), y!482, S(Nat.add(pred(x!481), y!482))), 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!2283, y!2284], body=If(Or(is(Inf, x!2283), is(Inf, y!2284)),    Inf,    Fin(fin(x!2283) + fin(y!2284))), 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!2295, y!2296], body=If(is(Inf, y!2296),    True,    If(is(Inf, x!2295), False, fin(x!2295) <= fin(y!2296))), 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!2305, y!2306], body=If(Or(is(Inf, x!2305), is(Inf, y!2306)),    Inf,    Fin(fin(x!2305)*fin(y!2306))), 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!525, y!526], body=x!525 + y!526, 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!1418, y!1419], body=absR(x!1418 - y!1419), ax=|= ForAll([x!1397, y!1398],        R.dist(x!1397, y!1398) == absR(x!1397 - y!1398)), _subst_fun_body=absR(Var(0) - Var(1))), R.max: Unfolding(name='R.max', decl=R.max, args=[x!615, y!616], body=If(x!615 >= y!616, x!615, y!616), 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!702], body=x!702*x!702, 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!763], body=K(Real, x!763), 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!1845, f!1846], body=Lambda(x, mul(c!1845, f!1846[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!1451], body=Lambda(i, x!1451), 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!1459], body=Lambda(i, a!1459[-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!1456, n!1457], body=Lambda(i, a!1456[i - n!1457]), 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!1494, a!1495], body=Lambda(n, x!1494*a!1495[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!2264, M!2265], body=ForAll(x, Implies(A!2264[x], M!2265 <= 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!2266], body=RSet.sup(Lambda(x, RSet.has_lb(A!2266, 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!2243], body=Exists(M, has_ub(A!2243, 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!2262], body=Lambda(x, x == c!2262), 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!705], body=x!705**(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!1334, y!1335], body=T_Int(Lambda(t, val(x!1334)[t] + val(y!1335)[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!1338, y!1339], body=T_Bool(Lambda(t, val(x!1338)[t] >= val(y!1339)[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!1340, y!1341], body=T_Bool(Lambda(t, val(x!1340)[t] <= val(y!1341)[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!1336, y!1337], body=T_Real(Lambda(t, val(x!1336)[t] + val(y!1337)[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!1876, v!1877], body=Vec2(x(u!1876) + x(v!1877), y(u!1876) + y(v!1877)), 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.cross: Unfolding(name='Vec2.cross', decl=Vec2.cross, args=[u!1893, v!1894], body=x(u!1893)*y(v!1894) - y(u!1893)*x(v!1894), ax=|= ForAll([u, v], Vec2.cross(u, v) == x(u)*y(v) - y(u)*x(v)), _subst_fun_body=x(Var(0))*y(Var(1)) - y(Var(0))*x(Var(1))), Vec2.dist: Unfolding(name='Vec2.dist', decl=Vec2.dist, args=[u!1891, v!1892], body=Real.sqrt(Vec2.norm2(Vec2.sub(u!1891, v!1892))), 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!1883, v!1884], body=x(u!1883)*x(v!1884) + y(u!1883)*y(v!1884), 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!1880], body=Vec2(-x(u!1880), -y(u!1880)), 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!1886], body=Real.sqrt(Vec2.dot(u!1886, u!1886)), 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!1885], body=Vec2.dot(u!1885, u!1885), ax=|= ForAll(u, Vec2.norm2(u) == Vec2.dot(u, u)), _subst_fun_body=Vec2.dot(Var(0), Var(0))), Vec2.smul: Unfolding(name='Vec2.smul', decl=Vec2.smul, args=[r!1881, u!1882], body=Vec2(r!1881*x(u!1882), r!1881*y(u!1882)), ax=|= ForAll([r, u], Vec2.smul(r, u) == Vec2(r*x(u), r*y(u))), _subst_fun_body=Vec2(Var(0)*x(Var(1)), Var(0)*y(Var(1)))), Vec2.sub: Unfolding(name='Vec2.sub', decl=Vec2.sub, args=[u!1878, v!1879], body=Vec2(x(u!1878) - x(v!1879), y(u!1878) - y(v!1879)), 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!2347, v!2348], body=Vec3(x(u!2347) + x(v!2348),      y(u!2347) + y(v!2348),      z(u!2347) + z(v!2348)), 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!2382, v!2383], body=Real.sqrt(Vec3.norm2(Vec3.sub(u!2382, v!2383))), 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!2364, v!2365], body=x(u!2364)*x(v!2365) + y(u!2364)*y(v!2365) + z(u!2364)*z(v!2365), 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!2353], body=Vec3(-x(u!2353), -y(u!2353), -z(u!2353)), 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!2377], body=Real.sqrt(Vec3.norm2(u!2377)), 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!2373], body=Vec3.dot(u!2373, u!2373), 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!2354, u!2355], body=Vec3(a!2354*x(u!2355), a!2354*y(u!2355), a!2354*z(u!2355)), 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!2351, v!2352], body=Vec3(x(u!2351) - x(v!2352),      y(u!2351) - y(v!2352),      z(u!2351) - z(v!2352)), 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!2413], body=Lambda(x, ∈(x, A!2413)), 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!2486], body=upair(x!2486, x!2486), 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!2418, B!2419], body=ForAll(x, Implies(∈(x, A!2418), ∈(x, B!2419))), 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!2765, B!2766], body=sep(A!2765, Lambda(x, Not(∈(x, B!2766)))), 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!425], body=And(ZSet.is_ub(A!425), ZSet.is_lb(A!425)), 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!422, y!423], body=ForAll(x, Implies(A!422[x], y!423 <= 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!419, y!420], body=ForAll(x, Implies(A!419[x], x <= y!420)), 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!424], body=Exists(x, ZSet.has_lb(A!424, 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!421], body=Exists(x, ZSet.has_ub(A!421, 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!881, y!882],        mul(x!881, y!882) == mul(y!882, x!881)), ax=|= abelian == (ForAll([x!881, y!882],         mul(x!881, y!882) == mul(y!882, x!881))), _subst_fun_body=ForAll([x!881, y!882],        mul(x!881, y!882) == mul(y!882, x!881))), absR: Unfolding(name='absR', decl=absR, args=[x!548], body=If(x!548 >= 0, x!548, -x!548), 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!1773, y!1774], body=Or(And(is(Real, x!1773), is(Real, y!1774)),    And(is(Inf, x!1773), Not(is(NegInf, y!1774))),    And(Not(is(NegInf, x!1773)), is(Inf, y!1774)),    And(is(NegInf, x!1773), Not(is(Inf, y!1774))),    And(Not(is(Inf, x!1773)), is(NegInf, y!1774))), 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!591, y!592, eps!593], body=If(x!591 - y!592 > 0, x!591 - y!592, -(x!591 - y!592)) <= eps!593, 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!1358], body=T_Bool(Lambda(t!1356,               ForAll(dt!1357,                      Implies(dt!1357 >= 0,                              val(p!1358)[t!1356 + dt!1357])))), ax=|= ForAll(p,        always(p) ==        T_Bool(Lambda(t!1356,                      ForAll(dt!1357,                             Implies(dt!1357 >= 0,                                     val(p)[t!1356 + dt!1357]))))), _subst_fun_body=T_Bool(Lambda(t!1356,               ForAll(dt!1357,                      Implies(dt!1357 >= 0,                              val(Var(2))[t!1356 + dt!1357]))))), and1: Unfolding(name='and1', decl=and1, args=[x!856, y!857], body=not1(nand1(x!856, y!857)), 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!871, y!872], body=Concat(and1(Extract(1, 1, x!871), Extract(1, 1, y!872)),        and1(Extract(0, 0, x!871), Extract(0, 0, y!872))), 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!1402, r!1403], body=Lambda(y!1401, absR(y!1401 - x!1402) < r!1403), ax=|= ForAll([x!1397, r!1400],        ball(x!1397, r!1400) ==        (Lambda(y!1401, absR(y!1401 - x!1397) < r!1400))), _subst_fun_body=Lambda(y!1401, absR(y!1401 - Var(1)) < Var(2))), bchoose: Unfolding(name='bchoose', decl=bchoose, args=[P!415, N!416], body=downsearch(P!415, N!416), 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!1362, q!1363], body=T_Bool(Lambda(t!1361,               val(p!1362)[t!1361] == val(q!1363)[t!1361])), ax=|= ForAll([p, q],        beq(p, q) ==        T_Bool(Lambda(t!1361,                      val(p)[t!1361] == val(q)[t!1361]))), _subst_fun_body=T_Bool(Lambda(t!1361,               val(Var(1))[t!1361] == val(Var(2))[t!1361]))), between: Unfolding(name='between', decl=between, args=[p!2017, q!2018, a!2019], body=And(collinear(p!2017, q!2018, a!2019),     Vec2.dot(Vec2.sub(q!2018, p!2017),              Vec2.sub(a!2019, p!2017)) >=     0,     Vec2.dot(Vec2.sub(p!2017, q!2018),              Vec2.sub(a!2019, q!2018)) >=     0), ax=|= ForAll([p, q, a],        between(p, q, a) ==        And(collinear(p, q, a),            Vec2.dot(Vec2.sub(q, p), Vec2.sub(a, p)) >= 0,            Vec2.dot(Vec2.sub(p, q), Vec2.sub(a, q)) >= 0)), _subst_fun_body=And(collinear(Var(0), Var(1), Var(2)),     Vec2.dot(Vec2.sub(Var(1), Var(0)),              Vec2.sub(Var(2), Var(0))) >=     0,     Vec2.dot(Vec2.sub(Var(0), Var(1)),              Vec2.sub(Var(2), Var(1))) >=     0)), bexist: Unfolding(name='bexist', decl=bexist, args=[A!1286, n!1287], body=If(n!1287 < 0,    False,    Or(A!1286[n!1287], bexists(A!1286, n!1287 - 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!417, N!418], body=P!417[bchoose(P!417, N!418)], 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!1288, n!1289], body=If(n!1289 < 0,    True,    And(A!1288[n!1289], bforall(A!1288, n!1289 - 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!2603], body=sep(pick(a!2603),     Lambda(x,            ForAll(b!2409,                   Implies(∈(b!2409, a!2603), ∈(x, b!2409))))), ax=|= ForAll(a!2408,        biginter(a!2408) ==        sep(pick(a!2408),            Lambda(x,                   ForAll(b!2409,                          Implies(∈(b!2409, a!2408),                                  ∈(x, b!2409)))))), _subst_fun_body=sep(pick(Var(0)),     Lambda(x,            ForAll(b!2409,                   Implies(∈(b!2409, Var(2)), ∈(x, b!2409)))))), cauchy_mod: Unfolding(name='cauchy_mod', decl=cauchy_mod, args=[a!1674, mod!1675], body=ForAll(eps,        Implies(eps > 0,                ForAll([m, k],                       Implies(m > mod!1675[eps],                               Implies(k > mod!1675[eps],                                       absR(a!1674[m] -                                         a!1674[k]) <                                       eps))))), ax=|= ForAll([a, mod],        cauchy_mod(a, mod) ==        (ForAll(eps,                Implies(eps > 0,                        ForAll([m, k],                               Implies(m > mod[eps],                                       Implies(k > mod[eps],                                         absR(a[m] - a[k]) <                                         eps))))))), _subst_fun_body=ForAll(eps,        Implies(eps > 0,                ForAll([m, k],                       Implies(m > Var(4)[eps],                               Implies(k > Var(4)[eps],                                       absR(Var(3)[m] -                                         Var(3)[k]) <                                       eps)))))), ceil: Unfolding(name='ceil', decl=ceil, args=[x!680], body=-floor(-x!680), ax=|= ForAll(x, ceil(x) == -floor(-x)), _subst_fun_body=-floor(-Var(0))), cinter: Unfolding(name='cinter', decl=cinter, args=[An!2280], body=Lambda(x, ForAll(n, An!2280[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!2049, p!2050], body=Lambda(q,        Vec2.norm2(Vec2.sub(p!2050, c!2049)) ==        Vec2.norm2(Vec2.sub(q, c!2049))), ax=|= ForAll([c, p],        circle(c, p) ==        (Lambda(q,                Vec2.norm2(Vec2.sub(p, c)) ==                Vec2.norm2(Vec2.sub(q, c))))), _subst_fun_body=Lambda(q,        Vec2.norm2(Vec2.sub(Var(2), Var(1))) ==        Vec2.norm2(Vec2.sub(q, Var(1))))), closed: Unfolding(name='closed', decl=closed, args=[A!1283], body=(Array Sierpinski Bool).open(complement(A!1283)), 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!2258, y!2259], body=Lambda(z, And(x!2258 <= z, z <= y!2259)), 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)))), collinear: Unfolding(name='collinear', decl=collinear, args=[p!2012, q!2013, a!2014], body=Vec2.cross(Vec2.sub(q!2013, p!2012),            Vec2.sub(a!2014, p!2012)) == 0, ax=|= ForAll([p, q, a],        collinear(p, q, a) ==        (Vec2.cross(Vec2.sub(q, p), Vec2.sub(a, p)) == 0)), _subst_fun_body=Vec2.cross(Vec2.sub(Var(1), Var(0)),            Vec2.sub(Var(2), Var(0))) == 0), comp: Unfolding(name='comp', decl=comp, args=[f!761, g!762], body=Lambda(x, f!761[g!762[x]]), ax=|= ForAll([f, g], comp(f, g) == (Lambda(x, f[g[x]]))), _subst_fun_body=Lambda(x, Var(1)[Var(2)[x]])), cong_seg: Unfolding(name='cong_seg', decl=cong_seg, args=[p!2021, q!2022, a!2023, b!2024], body=Vec2.norm2(Vec2.sub(p!2021, q!2022)) == Vec2.norm2(Vec2.sub(a!2023, b!2024)), ax=|= ForAll([p, q, a, b],        cong_seg(p, q, a, b) ==        (Vec2.norm2(Vec2.sub(p, q)) ==         Vec2.norm2(Vec2.sub(a, b)))), _subst_fun_body=Vec2.norm2(Vec2.sub(Var(0), Var(1))) == Vec2.norm2(Vec2.sub(Var(2), Var(3)))), conj: Unfolding(name='conj', decl=conj, args=[z!1427], body=C(re(z!1427), -im(z!1427)), 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!769, x!770], body=ForAll(eps,        Implies(eps > 0,                Exists(delta,                       And(delta > 0,                           ForAll(y,                                  Implies(absR(x!770 - y) <                                         delta,                                         absR(f!769[x!770] -                                         f!769[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!2386, v!2387], body=Vec3(y(u!2386)*z(v!2387) - z(u!2386)*y(v!2387),      z(u!2386)*x(v!2387) - x(u!2386)*z(v!2387),      x(u!2386)*y(v!2387) - y(u!2386)*x(v!2387)), 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!1507], body=Lambda(i,        If(i == 0,           a!1507[0],           If(i > 0,              cumsum(a!1507)[i - 1] + a!1507[i],              -cumsum(a!1507)[i + 1] - a!1507[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!2281], body=Lambda(x, Exists(n, An!2281[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!1462, n!1463], body=Lambda(i, a!1462[i*n!1463]), 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!1458], body=RSeq.shift(a!1458, 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!1473], body=Lambda(i, a!1473[i + 1] - a!1473[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!767, x!768], body=Exists(y, has_diff_at(f!767, x!768, 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!1460, n!1461], body=Lambda(i, a!1460[i/n!1461]), ax=|= ForAll([a, n], dilate(a, n) == (Lambda(i, a[i/n]))), _subst_fun_body=Lambda(i, Var(1)[i/Var(2)])), dir: Unfolding(name='dir', decl=dir, args=[p!2033], body=ray(Vec2(ToReal(0), ToReal(0)), p!2033), ax=|= ForAll(p, dir(p) == ray(Vec2(ToReal(0), ToReal(0)), p)), _subst_fun_body=ray(Vec2(ToReal(0), ToReal(0)), Var(0))), dom: Unfolding(name='dom', decl=dom, args=[R!2930], body=sep(bigunion(bigunion(R!2930)),     Lambda(x, Exists(y, ∈(pair(x, y), R!2930)))), 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!1454, a!1455], body=Lambda(i, a!1455[F!1454[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!480], body=If(is(Z, n!480), Z, S(S(double(pred(n!480))))), 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!413, n!414], body=If(P!413[n!414],    n!414,    If(n!414 < 0, 0, downsearch(P!413, n!414 - 1))), ax=|= ForAll([P, n!387],        downsearch(P, n!387) ==        If(P[n!387],           n!387,           If(n!387 < 0, 0, downsearch(P, n!387 - 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!384, m!385], body=Exists(p, m!385 == n!384*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!357], body=Exists(y, x!357 == 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!1355], body=T_Bool(Lambda(t!1353,               Exists(dt!1354,                      And(dt!1354 >= 0,                          val(p!1355)[t!1353 + dt!1354])))), ax=|= ForAll(p,        eventually(p) ==        T_Bool(Lambda(t!1353,                      Exists(dt!1354,                             And(dt!1354 >= 0,                                 val(p)[t!1353 + dt!1354]))))), _subst_fun_body=T_Bool(Lambda(t!1353,               Exists(dt!1354,                      And(dt!1354 >= 0,                          val(Var(2))[t!1353 + dt!1354]))))), expi: Unfolding(name='expi', decl=expi, args=[t!1438], body=C(Real.cos(t!1438), Real.sin(t!1438)), 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!1642], 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!386], body=If(n!386 <= 0, 1, n!386*fact(n!386 - 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!1593, n!1594], body=cumsum(a!1593)[n!1594], 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!663], body=ToReal(ToInt(x!663)), 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!458], body=If(a!458 <= 0, Z, S(from_int(a!458 - 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!427], body=If(n!427%2 == 0, n!427/2, -(n!427 + 1)/2), ax=|= ForAll(n!387,        from_nat(n!387) ==        If(n!387%2 == 0, n!387/2, -(n!387 + 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!2802], body=pick(biginter(p!2802)), ax=|= ForAll(p!2412, fst(p!2412) == pick(biginter(p!2412))), _subst_fun_body=pick(biginter(Var(0)))), geom: Unfolding(name='geom', decl=geom, args=[x!1452], body=Lambda(i, pownat(x!1452, 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!1668, M!1669], body=ForAll(n, absR(a!1668[n]) <= M!1669), 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!1676, y!1677], body=ForAll(eps,        Implies(eps > 0,                Exists(N,                       ForAll(n,                              Implies(n > N,                                      absR(a!1676[n] - y!1677) <                                      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!764, p!765, L!766], body=ForAll(eps,        Implies(0 < eps,                Exists(delta,                       And(delta > 0,                           ForAll(x,                                  Implies(0 < absR(x - p!765),                                         Implies(absR(x -                                         p!765) <                                         delta,                                         absR(f!764[x] -                                         L!766) <                                         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(0 <                                         absR(x - p),                                         Implies(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(0 <                                         absR(x - Var(4)),                                         Implies(absR(x -                                         Var(4)) <                                         delta,                                         absR(Var(3)[x] -                                         Var(5)) <                                         eps)))))))), has_max: Unfolding(name='has_max', decl=has_max, args=[A!2254, x!2255], body=And(A!2254[x!2255], RSet.sup(A!2254) == x!2255), 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!1721, y!1722], body=has_lim(cumsum(a!1721), y!1722), 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!2241, M!2242], body=ForAll(x, Implies(A!2241[x], x <= M!2242)), 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!1293, b!1294], body=Prop(Lambda(w, And(val(a!1293)[w], val(b!1294)[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!1385, y!1386], body=T_Bool(Lambda(t!1384,               val(x!1385)[t!1384] == val(y!1386)[t!1384])), ax=|= ForAll([x, y],        ieq(x, y) ==        T_Bool(Lambda(t!1384,                      val(x)[t!1384] == val(y)[t!1384]))), _subst_fun_body=T_Bool(Lambda(t!1384,               val(Var(1))[t!1384] == val(Var(2))[t!1384]))), if_int: Unfolding(name='if_int', decl=if_int, args=[p!1393, x!1394, y!1395], body=T_Int(Lambda(t!1392,              If(val(p!1393)[t!1392],                 val(x!1394)[t!1392],                 val(y!1395)[t!1392]))), ax=|= ForAll([p, x, y],        if_int(p, x, y) ==        T_Int(Lambda(t!1392,                     If(val(p)[t!1392],                        val(x)[t!1392],                        val(y)[t!1392])))), _subst_fun_body=T_Int(Lambda(t!1392,              If(val(Var(1))[t!1392],                 val(Var(2))[t!1392],                 val(Var(3))[t!1392])))), iimpl: Unfolding(name='iimpl', decl=iimpl, args=[a!1297, b!1298], body=Prop(Lambda(w,             ForAll(u,                    Implies(acc(w, u),                            Implies(val(a!1297)[u],                                    val(b!1298)[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!1453], body=Lambda(i, If(S!1453[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!1388, y!1389], body=T_Bool(Lambda(t!1387,               val(x!1388)[t!1387] != val(y!1389)[t!1387])), ax=|= ForAll([x, y],        ineq(x, y) ==        T_Bool(Lambda(t!1387,                      val(x)[t!1387] != val(y)[t!1387]))), _subst_fun_body=T_Bool(Lambda(t!1387,               val(Var(1))[t!1387] != val(Var(2))[t!1387]))), inext: Unfolding(name='inext', decl=inext, args=[x!1391], body=T_Int(Lambda(t!1390, val(x!1391)[t!1390 + 1])), ax=|= ForAll(x,        inext(x) == T_Int(Lambda(t!1390, val(x)[t!1390 + 1]))), _subst_fun_body=T_Int(Lambda(t!1390, val(Var(1))[t!1390 + 1]))), inot: Unfolding(name='inot', decl=inot, args=[a!1299], body=Prop(Lambda(w,             ForAll(u,                    Implies(acc(w, u),                            Implies(val(a!1299)[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!2620, B!2621], body=sep(A!2620, Lambda(x, ∈(x, B!2621))), 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!1295, b!1296], body=Prop(Lambda(w, Or(val(a!1295)[w], val(b!1296)[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!1670], body=Exists(M, has_bound(a!1670, 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!1673], body=ForAll(eps,        Implies(eps > 0,                Exists(N,                       ForAll([m, k],                              Implies(m > N,                                      Implies(k > N,                                         absR(a!1673[m] -                                         a!1673[k]) <                                         eps)))))), ax=|= ForAll(a,        is_cauchy(a) ==        (ForAll(eps,                Implies(eps > 0,                        Exists(N,                               ForAll([m, k],                                      Implies(m > N,                                         Implies(k > N,                                         absR(a[m] - a[k]) <                                         eps)))))))), _subst_fun_body=ForAll(eps,        Implies(eps > 0,                Exists(N,                       ForAll([m, k],                              Implies(m > N,                                      Implies(k > N,                                         absR(Var(4)[m] -                                         Var(4)[k]) <                                         eps))))))), is_circle: Unfolding(name='is_circle', decl=is_circle, args=[A!2051], body=Exists([c, q], ForAll(p, circle(c, q)[p] == A!2051[p])), ax=|= ForAll(A,        is_circle(A) ==        (Exists([c, q], ForAll(p, circle(c, q)[p] == A[p])))), _subst_fun_body=Exists([c, q], ForAll(p, circle(c, q)[p] == Var(3)[p]))), is_cont: Unfolding(name='is_cont', decl=is_cont, args=[f!775], body=ForAll(x, cont_at(f!775, 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!1678], body=Exists(y, has_lim(a!1678, 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!774], body=ForAll(x, diff_at(f!774, x)), ax=|= ForAll(f, is_diff(f) == (ForAll(x, diff_at(f, x)))), _subst_fun_body=ForAll(x, diff_at(Var(1), x))), is_dir: Unfolding(name='is_dir', decl=is_dir, args=[A!2034], body=Exists(p,        And(p != Vec2(ToReal(0), ToReal(0)),            Vec2.norm2(p) == 1,            dir(p) == A!2034)), ax=|= ForAll(A,        is_dir(A) ==        (Exists(p,                And(p != Vec2(ToReal(0), ToReal(0)),                    Vec2.norm2(p) == 1,                    dir(p) == A)))), _subst_fun_body=Exists(p,        And(p != Vec2(ToReal(0), ToReal(0)),            Vec2.norm2(p) == 1,            dir(p) == Var(1)))), is_empty: Unfolding(name='is_empty', decl=is_empty, args=[I!2065], 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!1006], body=mul(A!1006, A!1006) == A!1006, ax=|= ForAll(A, is_idem(A) == (mul(A, A) == A)), _subst_fun_body=mul(Var(0), Var(0)) == Var(0)), is_line: Unfolding(name='is_line', decl=is_line, args=[A!1956], body=Exists([p, q],        And(p != q, ForAll(a, line(p, q)[a] == A!1956[a]))), ax=|= ForAll(A,        is_line(A) ==        (Exists([p, q],                And(p != q, ForAll(a, line(p, q)[a] == A[a]))))), _subst_fun_body=Exists([p, q],        And(p != q, ForAll(a, line(p, q)[a] == Var(3)[a])))), is_linear: Unfolding(name='is_linear', decl=is_linear, args=[f!1847], body=And(ForAll([x, y],            f!1847[R.add(x, y)] ==            R.add(f!1847[x], f!1847[y])),     ForAll([x, c], f!1847[mul(c, x)] == mul(c, f!1847[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!1842, x!1843], body=And(upper_bound(A!1842, x!1843),     ForAll(y,            Implies(upper_bound(A!1842, y),                    EReal.le(x!1843, 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!1671], body=ForAll([n, m], Implies(n <= m, a!1671[n] <= a!1671[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!1672], body=ForAll(n, a!1672[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!1404], body=ForAll(x!1397,        Implies(S!1404[x!1397],                Exists(r!1400,                       And(0 < r!1400,                           subset(ball(x!1397, r!1400),                                  S!1404))))), ax=|= ForAll(S,        is_open(S) ==        (ForAll(x!1397,                Implies(S[x!1397],                        Exists(r!1400,                               And(0 < r!1400,                                   subset(ball(x!1397,                                         r!1400),                                         S))))))), _subst_fun_body=ForAll(x!1397,        Implies(Var(1)[x!1397],                Exists(r!1400,                       And(0 < r!1400,                           subset(ball(x!1397, r!1400),                                  Var(2))))))), is_orth: Unfolding(name='is_orth', decl=is_orth, args=[A!1005], body=mul(A!1005, trans(A!1005)) == 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!2801], body=Exists([a!2408, b!2409], pair(a!2408, b!2409) == c!2801), ax=|= ForAll(c!2410,        is_pair(c!2410) ==        (Exists([a!2408, b!2409],                pair(a!2408, b!2409) == c!2410))), _subst_fun_body=Exists([a!2408, b!2409], pair(a!2408, b!2409) == Var(2))), is_parallel: Unfolding(name='is_parallel', decl=is_parallel, args=[A!2008, B!2009], body=Vec2.cross(Vec2.sub(f!2004(A!2008), f!2005(A!2008)),            Vec2.sub(f!2004(B!2009), f!2005(B!2009))) == 0, ax=|= ForAll([A, B],        is_parallel(A, B) ==        (Vec2.cross(Vec2.sub(f!2004(A), f!2005(A)),                    Vec2.sub(f!2004(B), f!2005(B))) ==         0)), _subst_fun_body=Vec2.cross(Vec2.sub(f!2004(Var(0)), f!2005(Var(0))),            Vec2.sub(f!2004(Var(1)), f!2005(Var(1)))) == 0), is_perp: Unfolding(name='is_perp', decl=is_perp, args=[A!2006, B!2007], body=Vec2.dot(Vec2.sub(f!2004(A!2006), f!2005(A!2006)),          Vec2.sub(f!2004(B!2007), f!2005(B!2007))) == 0, ax=|= ForAll([A, B],        is_perp(A, B) ==        (Vec2.dot(Vec2.sub(f!2004(A), f!2005(A)),                  Vec2.sub(f!2004(B), f!2005(B))) ==         0)), _subst_fun_body=Vec2.dot(Vec2.sub(f!2004(Var(0)), f!2005(Var(0))),          Vec2.sub(f!2004(Var(1)), f!2005(Var(1)))) == 0), is_point: Unfolding(name='is_point', decl=is_point, args=[A!1953], body=Exists(p, point(p) == A!1953), ax=|= ForAll(A, is_point(A) == (Exists(p, point(p) == A))), _subst_fun_body=Exists(p, point(p) == Var(1))), is_rel: Unfolding(name='is_rel', decl=is_rel, args=[R!2929], body=ForAll(p!2412, Implies(∈(p!2412, R!2929), is_pair(p!2412))), ax=|= ForAll(R,        is_rel(R) ==        (ForAll(p!2412,                Implies(∈(p!2412, R), is_pair(p!2412))))), _subst_fun_body=ForAll(p!2412, Implies(∈(p!2412, Var(1)), is_pair(p!2412)))), is_set: Unfolding(name='is_set', decl=is_set, args=[P!2416], body=Exists(A, reflects(P!2416, 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!1723], body=Exists(y, has_sum(a!1723, 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!1004], body=trans(A!1004) == A!1004, 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!1464, x!1465], body=Lambda(i,        If(i <= 0,           x!1465,           f!1464[iterate(f!1464, x!1465)[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!2059, j!2060], body=Interval(min(lo(i!2059), lo(j!2060)),          R.max(hi(i!2059), hi(j!2060))), 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!1469], body=Lambda(i, If(i == n!1469, 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!1680], body=f!1679(A!1680), ax=|= ForAll(A!1448, lim(A!1448) == f!1679(A!1448)), _subst_fun_body=f!1679(Var(0))), line: Unfolding(name='line', decl=line, args=[p!1954, q!1955], body=Lambda(a,        Vec2.cross(Vec2.sub(a, p!1954),                   Vec2.sub(q!1955, p!1954)) ==        0), ax=|= ForAll([p, q],        line(p, q) ==        (Lambda(a,                Vec2.cross(Vec2.sub(a, p), Vec2.sub(q, p)) ==                0))), _subst_fun_body=Lambda(a,        Vec2.cross(Vec2.sub(a, Var(1)),                   Vec2.sub(Var(2), Var(1))) ==        0)), max: Unfolding(name='max', decl=max, args=[a!1550], body=Lambda(i,        If(i == 0,           a!1550[0],           If(i > 0,              R.max(max(a!1550)[i - 1], a!1550[i]),              R.max(max(a!1550)[i + 1], a!1550[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!2053, j!2054], body=Interval(R.max(lo(i!2053), lo(j!2054)),          min(hi(i!2053), hi(j!2054))), 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!2067], body=(lo(i!2067) + hi(i!2067))/2, ax=|= ForAll(i, mid(i) == (lo(i) + hi(i))/2), _subst_fun_body=(lo(Var(0)) + hi(Var(0)))/2), midp: Unfolding(name='midp', decl=midp, args=[p!2010, q!2011], body=Vec2.smul(1/2, Vec2.add(p!2010, q!2011)), ax=|= ForAll([p, q], midp(p, q) == Vec2.smul(1/2, Vec2.add(p, q))), _subst_fun_body=Vec2.smul(1/2, Vec2.add(Var(0), Var(1)))), min: Unfolding(name='min', decl=min, args=[x!634, y!635], body=If(x!634 <= y!635, x!634, y!635), 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!1292], body=mu_iter(A!1292, 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!1290, n!1291], body=If(A!1290[n!1291], n!1291, mu_iter(A!1290, n!1291 + 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!536, y!537], body=x!536*y!537, ax=|= ForAll([x, y], mul(x, y) == x*y), _subst_fun_body=Var(0)*Var(1)), nand1: Unfolding(name='nand1', decl=nand1, args=[x!851, y!852], body=~(x!851 & y!852), ax=|= ForAll([x, y], nand1(x, y) == ~(x & y)), _subst_fun_body=~(Var(0) & Var(1))), nand2: Unfolding(name='nand2', decl=nand2, args=[x!866, y!867], body=Concat(nand1(Extract(1, 1, x!866), Extract(1, 1, y!867)),        nand1(Extract(0, 0, x!866), Extract(0, 0, y!867))), 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!158], body=If(rom(st!158)[pc(st!158)] >> 15 == 0,    Nand2State(pc(st!158) + 1,               rom(st!158),               ram(st!158),               D(st!158),               rom(st!158)[pc(st!158)]),    Nand2State(If(If(rom(st!158)[pc(st!158)] & 7 == 0,                     False,                     If(rom(st!158)[pc(st!158)] & 7 == 1,                        If(rom(st!158)[pc(st!158)] >> 6 & 127 ==                           42,                           0,                           If(rom(st!158)[pc(st!158)] >> 6 &                              127 ==                              63,                              1,                              If(rom(st!158)[pc(st!158)] >> 6 &                                 127 ==                                 58,                                 65535,                                 If(rom(st!158)[pc(st!158)] >>                                    6 &                                    127 ==                                    12,                                    D(st!158),                                    If(rom(st!158)[pc(st!158)] >>                                       6 &                                       127 ==                                       48,                                       A(st!158),                                       If(rom(st!158)[pc(st!158)] >>                                         6 &                                         127 ==                                         112,                                         rom(st!158)[A(st!158)],                                         If(rom(st!158)[pc(st!158)] >>                                         6 &                                         127 ==                                         13,                                         ~D(st!158),                                         If(rom(st!158)[pc(st!158)] >>                                         6 &                                         127 ==                                         49,                                         ~A(st!158),                                         If(rom(st!158)[pc(st!158)] >>                                         6 &                                         127 ==                                         113,                                         ~rom(st!158)[A(st!158)],                                         If(rom(...)[pc(...)] >>                                         6 &                                         127 ==                                         15,                                         -D(st!158),                                         If(...[...] >> 6 &                                         127 ==                                         51,                                         -A(st!158),                                         If(... >> ... & 127 ==                                         115,                                         -rom(...)[A(...)],                                         If(... & ... == 31,                                         D(...) + 1,                                         If(... == ...,                                         ... + ...,                                         If(..., ..., ...))))))))))))))) >                        0,                        If(rom(st!158)[pc(st!158)] & 7 == 2,                           If(rom(st!158)[pc(st!158)] >> 6 &                              127 ==                              42,                              0,                              If(rom(st!158)[pc(st!158)] >> 6 &                                 127 ==                                 63,                                 1,                                 If(rom(st!158)[pc(st!158)] >>                                    6 &                                    127 ==                                    58,                                    65535,                                    If(rom(st!158)[pc(st!158)] >>                                       6 &                                       127 ==                                       12,                                       D(st!158),                                       If(rom(st!158)[pc(st!158)] >>                                         6 &                                         127 ==                                         48,                                         A(st!158),                                         If(rom(st!158)[pc(st!158)] >>                                         6 &                                         127 ==                                         112,                                         rom(st!158)[A(st!158)],                                         If(rom(st!158)[pc(st!158)] >>                                         6 &                                         127 ==                                         13,                                         ~D(st!158),                                         If(rom(st!158)[pc(st!158)] >>                                         6 &                                         127 ==                                         49,                                         ~A(st!158),                                         If(rom(...)[pc(...)] >>                                         6 &                                         127 ==                                         113,                                         ~rom(st!158)[A(st!158)],                                         If(...[...] >> 6 &                                         127 ==                                         15,                                         -D(st!158),                                         If(... >> ... & 127 ==                                         51,                                         -A(st!158),                                         If(... & ... == 115,                                         -...[...],                                         If(... == ...,                                         ... + ...,                                         If(..., ..., ...)))))))))))))) ==                           0,                           If(rom(st!158)[pc(st!158)] & 7 ==                              3,                              If(rom(st!158)[pc(st!158)] >> 6 &                                 127 ==                                 42,                                 0,                                 If(rom(st!158)[pc(st!158)] >>                                    6 &                                    127 ==                                    63,                                    1,                                    If(rom(st!158)[pc(st!158)] >>                                       6 &                                       127 ==                                       58,                                       65535,                                       If(rom(st!158)[pc(st!158)] >>                                         6 &                                         127 ==                                         12,                                         D(st!158),                                         If(rom(st!158)[pc(st!158)] >>                                         6 &                                         127 ==                                         48,                                         A(st!158),                                         If(rom(st!158)[pc(st!158)] >>                                         6 &                                         127 ==                                         112,                                         rom(st!158)[A(st!158)],                                         If(rom(st!158)[pc(st!158)] >>                                         6 &                                         127 ==                                         13,                                         ~D(st!158),                                         If(rom(...)[pc(...)] >>                                         6 &                                         127 ==                                         49,                                         ~A(st!158),                                         If(...[...] >> 6 &                                         127 ==                                         113,                                         ~rom(st!158)[A(st!158)],                                         If(... >> ... & 127 ==                                         15,                                         -D(st!158),                                         If(... & ... == 51,                                         -A(...),                                         If(... == ...,                                         -...,                                         If(..., ..., ...))))))))))))) >=                              0,                              If(rom(st!158)[pc(st!158)] & 7 ==                                 4,                                 If(rom(st!158)[pc(st!158)] >>                                    6 &                                    127 ==                                    42,                                    0,                                    If(rom(st!158)[pc(st!158)] >>                                       6 &                                       127 ==                                       63,                                       1,                                       If(rom(st!158)[pc(st!158)] >>                                         6 &                                         127 ==                                         58,                                         65535,                                         If(rom(st!158)[pc(st!158)] >>                                         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!434, m!435], body=((n!434 + m!435)*(n!434 + m!435 + 1))/2 + m!435, ax=|= ForAll([n!387, m!397],        natpair(n!387, m!397) ==        ((n!387 + m!397)*(n!387 + m!397 + 1))/2 + m!397), _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!444], body=If(k!444 < 0,    Tuple_Int_Int(-1, -1),    If(k!444 == 0,       Tuple_Int_Int(0, 0),       If(_0(natpair_to_tuple(k!444 - 1)) == 0,          Tuple_Int_Int(_1(natpair_to_tuple(k!444 - 1)) + 1,                        0),          Tuple_Int_Int(_0(natpair_to_tuple(k!444 - 1)) - 1,                        _1(natpair_to_tuple(k!444 - 1)) + 1)))), ax=|= ForAll(k!388,        natpair_to_tuple(k!388) ==        If(k!388 < 0,           Tuple_Int_Int(-1, -1),           If(k!388 == 0,              Tuple_Int_Int(0, 0),              If(_0(natpair_to_tuple(k!388 - 1)) == 0,                 Tuple_Int_Int(_1(natpair_to_tuple(k!388 - 1)) +                               1,                               0),                 Tuple_Int_Int(_0(natpair_to_tuple(k!388 - 1)) -                               1,                               _1(natpair_to_tuple(k!388 - 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!2282], body=ForAll(n, subset(An!2282[n + 1], An!2282[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!1360], body=T_Bool(Lambda(t!1359, val(p!1360)[t!1359 + 1])), ax=|= ForAll(p,        next(p) == T_Bool(Lambda(t!1359, val(p)[t!1359 + 1]))), _subst_fun_body=T_Bool(Lambda(t!1359, val(Var(1))[t!1359 + 1]))), nonneg: Unfolding(name='nonneg', decl=nonneg, args=[x!612], body=absR(x!612) == x!612, ax=|= ForAll(x, nonneg(x) == (absR(x) == x)), _subst_fun_body=absR(Var(0)) == Var(0)), not1: Unfolding(name='not1', decl=not1, args=[x!853], body=nand1(x!853, x!853), ax=|= ForAll(x, not1(x) == nand1(x, x)), _subst_fun_body=nand1(Var(0), Var(0))), not2: Unfolding(name='not2', decl=not2, args=[x!868], body=Concat(not1(Extract(1, 1, x!868)),        not1(Extract(0, 0, x!868))), 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!358], body=Exists(y, x!358 == 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!2339], body=NDArray(Unit(n!2339), 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!2256, y!2257], body=Lambda(z, And(x!2256 < z, z < y!2257)), 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!861, y!862], body=nand1(not1(x!861), not1(y!862)), 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!876, y!877], body=Concat(or1(Extract(1, 1, x!876), Extract(1, 1, y!877)),        or1(Extract(0, 0, x!876), Extract(0, 0, y!877))), 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!456], body=from_nat(natpair(to_nat(n!456), to_nat(m!397))), ax=|= ForAll(n!387,        pair(n!387) ==        from_nat(natpair(to_nat(n!387), to_nat(m!397)))), _subst_fun_body=from_nat(natpair(to_nat(Var(0)), to_nat(m!397)))), pair: Unfolding(name='pair', decl=pair, args=[a!2799, b!2800], body=upair(ZF.sing(a!2799), upair(a!2799, b!2800)), ax=|= ForAll([a!2408, b!2409],        pair(a!2408, b!2409) ==        upair(ZF.sing(a!2408), upair(a!2408, b!2409))), _subst_fun_body=upair(ZF.sing(Var(0)), upair(Var(0), Var(1)))), perp: Unfolding(name='perp', decl=perp, args=[u!2384, v!2385], body=Vec3.dot(u!2384, v!2385) == 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!2433], body=f!2432(a!2433), ax=|= ForAll(a!2408, pick(a!2408) == f!2432(a!2408)), _subst_fun_body=f!2432(Var(0))), point: Unfolding(name='point', decl=point, args=[p!1952], body=Store(K(Vec2, False), p!1952, True), ax=|= ForAll(p, point(p) == Store(K(Vec2, False), p, True)), _subst_fun_body=Store(K(Vec2, False), Var(0), True)), pos: Unfolding(name='pos', decl=pos, args=[a!1472], body=Lambda(i, If(i >= 0, a!1472[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!686, y!687], body=x!686**y!687, ax=|= ForAll([x, y], pow(x, y) == x**y), _subst_fun_body=Var(0)**Var(1)), powers: Unfolding(name='powers', decl=powers, args=[x!1724], body=Lambda(i,        If(i == 0,           1,           If(i < 0,              powers(x!1724)[i + 1]/x!1724,              x!1724*powers(x!1724)[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!695, n!696], body=If(n!696 == 0,    1,    If(n!696 > 0,       x!695*pownat(x!695, n!696 - 1),       pownat(x!695, n!696 + 1)/x!695)), 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!383], body=And(n!383 > 1,     Not(Exists([p, q], And(p > 1, q > 1, n!383 == 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!2856, B!2857], body=sep(pow(pow(union(A!2856, B!2857))),     Lambda(p!2412,            Exists([x, y],                   And(And(∈(x, A!2856), ∈(y, B!2857)),                       p!2412 == pair(x, y))))), ax=|= ForAll([A, B],        prod(A, B) ==        sep(pow(pow(union(A, B))),            Lambda(p!2412,                   Exists([x, y],                          And(And(∈(x, A), ∈(y, B)),                              p!2412 == pair(x, y)))))), _subst_fun_body=sep(pow(pow(union(Var(0), Var(1)))),     Lambda(p!2412,            Exists([x, y],                   And(And(∈(x, Var(3)), ∈(y, Var(4))),                       p!2412 == pair(x, y)))))), ran: Unfolding(name='ran', decl=ran, args=[R!2931], body=sep(bigunion(bigunion(R!2931)),     Lambda(y, Exists(x, ∈(pair(x, y), R!2931)))), 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)))))), ray: Unfolding(name='ray', decl=ray, args=[p!2031, q!2032], body=Lambda(a,        And(collinear(p!2031, q!2032, a),            Vec2.dot(Vec2.sub(q!2032, p!2031),                     Vec2.sub(a, p!2031)) >=            0)), ax=|= ForAll([p, q],        ray(p, q) ==        (Lambda(a,                And(collinear(p, q, a),                    Vec2.dot(Vec2.sub(q, p), Vec2.sub(a, p)) >=                    0)))), _subst_fun_body=Lambda(a,        And(collinear(Var(1), Var(2), a),            Vec2.dot(Vec2.sub(Var(2), Var(1)),                     Vec2.sub(a, Var(1))) >=            0))), reflects: Unfolding(name='reflects', decl=reflects, args=[P!2414, A!2415], body=ForAll(x, ∈(x, A!2415) == P!2414[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!1645], body=Map(absR, a!1645), 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!1644], body=Map(Real.cos, a!1644), 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!1610, a!1611, b!1612], body=finsum((Array Int Real).mul(a!1611, b!1612), n!1610), 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!1640, b!1641], body=Lambda([i, j], a!1640[i]*b!1641[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!1643], body=Map(Real.sin, a!1643), 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!457], body=If(is(Z, n!457), Z, pred(n!457)), 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!410, n!411], body=If(P!410[n!411],    n!411,    If(P!410[-n!411], -n!411, If(P!410[n!411 + 1], 1, 0))), ax=|= ForAll([P, n!387],        search(P, n!387) ==        If(P[n!387],           n!387,           If(P[-n!387], -n!387, If(P[n!387 + 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!549], body=If(x!549 > 0, 1, If(x!549 < 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!2260, c!2261], body=Lambda(x, A!2260[x - c!2261]), 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!2803], body=If(ZF.sing(ZF.sing(fst(p!2803))) == p!2803,    fst(p!2803),    pick(ZFSet.sub(bigunion(p!2803), ZF.sing(fst(p!2803))))), ax=|= ForAll(p!2412,        snd(p!2412) ==        If(ZF.sing(ZF.sing(fst(p!2412))) == p!2412,           fst(p!2412),           pick(ZFSet.sub(bigunion(p!2412),                          ZF.sing(fst(p!2412)))))), _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!532, y!533], body=x!532 - y!533, ax=|= ForAll([x, y], sub(x, y) == x - y), _subst_fun_body=Var(0) - Var(1)), tan: Unfolding(name='tan', decl=tan, args=[x!760], body=Real.sin(x!760)/Real.cos(x!760), 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!1345, q!1346], body=T_Bool(Lambda(t!1344,               And(val(p!1345)[t!1344], val(q!1346)[t!1344]))), ax=|= ForAll([p, q],        tand(p, q) ==        T_Bool(Lambda(t!1344,                      And(val(p)[t!1344], val(q)[t!1344])))), _subst_fun_body=T_Bool(Lambda(t!1344,               And(val(Var(1))[t!1344], val(Var(2))[t!1344])))), temp.valid: Unfolding(name='temp.valid', decl=temp.valid, args=[p!1364], body=val(p!1364)[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!1351, q!1352], body=T_Bool(Lambda(t!1350,               Implies(val(p!1351)[t!1350],                       val(q!1352)[t!1350]))), ax=|= ForAll([p, q],        timpl(p, q) ==        T_Bool(Lambda(t!1350,                      Implies(val(p)[t!1350], val(q)[t!1350])))), _subst_fun_body=T_Bool(Lambda(t!1350,               Implies(val(Var(1))[t!1350],                       val(Var(2))[t!1350])))), tint: Unfolding(name='tint', decl=tint, args=[x!1396], body=T_Int(K(Int, x!1396)), 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!1343], body=T_Bool(Lambda(t!1342, Not(val(p!1343)[t!1342]))), ax=|= ForAll(p,        tnot(p) ==        T_Bool(Lambda(t!1342, Not(val(p)[t!1342])))), _subst_fun_body=T_Bool(Lambda(t!1342, Not(val(Var(1))[t!1342])))), to_int: Unfolding(name='to_int', decl=to_int, args=[n!459], body=If(is(Z, n!459), 0, 1 + to_int(pred(n!459))), 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!426], body=If(n!426 >= 0, n!426*2, n!426*-2 - 1), ax=|= ForAll(n!387,        to_nat(n!387) ==        If(n!387 >= 0, n!387*2, n!387*-2 - 1)), _subst_fun_body=If(Var(0) >= 0, Var(0)*2, Var(0)*-2 - 1)), tor: Unfolding(name='tor', decl=tor, args=[p!1348, q!1349], body=T_Bool(Lambda(t!1347,               Or(val(p!1348)[t!1347], val(q!1349)[t!1347]))), ax=|= ForAll([p, q],        tor(p, q) ==        T_Bool(Lambda(t!1347,                      Or(val(p)[t!1347], val(q)[t!1347])))), _subst_fun_body=T_Bool(Lambda(t!1347,               Or(val(Var(1))[t!1347], val(Var(2))[t!1347])))), union: Unfolding(name='union', decl=union, args=[A!2509, B!2510], body=bigunion(upair(A!2509, B!2510)), 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!1840, x!1841], body=ForAll(y, Implies(A!1840[y], EReal.le(y, x!1841))), 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!1300], body=ForAll(w, val(a!1300)[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!1466, a!1467, b!1468], body=Lambda(i, If(mask!1466[i], a!1467[i], b!1468[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!2066], body=hi(i!2066) - lo(i!2066), 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!2338], body=NDArray(Unit(n!2338), K(Int, 0)), ax=|= ForAll(n, zero(n) == NDArray(Unit(n), K(Int, 0))), _subst_fun_body=NDArray(Unit(Var(0)), K(Int, 0))), zf.false: Unfolding(name='zf.false', decl=zf.false, args=[], body=∅, ax=|= zf.false == ∅, _subst_fun_body=∅), zf.succ: Unfolding(name='zf.succ', decl=zf.succ, args=[x!2932], body=union(x!2932, ZF.sing(x!2932)), ax=|= ForAll(x, zf.succ(x) == union(x, ZF.sing(x))), _subst_fun_body=union(Var(0), ZF.sing(Var(0)))), zf.true: Unfolding(name='zf.true', decl=zf.true, args=[], body=ZF.sing(∅), ax=|= zf.true == ZF.sing(∅), _subst_fun_body=ZF.sing(∅)), zf.zero: Unfolding(name='zf.zero', decl=zf.zero, args=[], body=∅, ax=|= zf.zero == ∅, _subst_fun_body=∅)}

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:

Proof

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:

Proof

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!...)
Parameters:
  • vs (list[ExprRef])

  • pf (Proof)

Return type:

Proof

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:

Proof

kdrag.kernel.instan(ts: Sequence[ExprRef], pf: Proof) → Proof

Instantiate a universally quantified formula. This is forall elimination

Parameters:
  • ts (Sequence[ExprRef])

  • pf (Proof)

Return type:

Proof

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.is_proof(p: Proof) → bool
Parameters:

p (Proof)

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)
Parameters:

pf (Proof)

Return type:

Unfolding

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
Parameters:
Return type:

Proof

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: str | Callable[[], Any] | None = 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.

  • solver (str | Callable[[], Any] | None) – A solver factory or “z3”, “cvc5”, “vampire”, “eprover”. None uses the configured default.

Returns:

A proof object of thm

Return type:

Proof

>>> 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))
Parameters:
  • pf (Proof)

  • vs (list[ExprRef])

Return type:

Proof

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:

Proof

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)
Parameters:
  • t (ExprRef)

  • eqs (Sequence[Proof])

Return type:

tuple[ExprRef, Proof]

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)
Parameters:
  • pf (Proof)

  • patterns (list[ExprRef])

  • no_patterns (list[ExprRef])

Return type:

Proof

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]

kdrag.kernel.unfold_defns(e: ExprRef, defns: Sequence[Unfolding]) → tuple[ExprRef, Proof]

Unfold definitions in an expression.

Parameters:
Return type:

tuple[ExprRef, Proof]

kdrag.kernel.weaken(pf: Proof, fvs: Sequence[ExprRef]) → Proof
Parameters:
  • pf (Proof)

  • fvs (Sequence[ExprRef])

Return type:

Proof