FindEquationalProof[thm,axms]
tries to find an equational proof of the symbolic theorem thm using the axioms axms.
FindEquationalProof[thm,"theory"]
tries to find a proof of thm using the specified named axiomatic theory.
FindEquationalProof
FindEquationalProof[thm,axms]
tries to find an equational proof of the symbolic theorem thm using the axioms axms.
FindEquationalProof[thm,"theory"]
tries to find a proof of thm using the specified named axiomatic theory.
Details and Options
- If FindEquationalProof[thm,axms] succeeds in deriving the theorem thm from the axioms axms, then it returns a ProofObject expression. If it succeeds in showing that the theorem cannot be derived from the axioms, it returns a Failure object. Otherwise, it may not terminate unless time constrained.
- Axioms and theorems can be given in equational form or as formulas in first-order logic. Formulas in first-order logic are converted to an equational form.
- The statements thm and axms can be any logical combination of terms of the form:
-
expr1expr2 assertion of equality p[expr1,…] arbitrary symbolic predicate ForAll[vars,stmt] assertion that stmt is true for all values of vars Exists[vars,stmt] assertion that values of vars exist for which stmt is true - The expri can be arbitrary symbolic expressions, with heads representing formal operators, functions, etc.
- The statements stmt can consist of arbitrary logical combinations of predicates.
- FindEquationalProof[expr1&&expr2&&…,axm1&&axm2&&…] will treat each of expr1,expr2,… as a separate hypothesis, and each of axm1,axm2,… as a separate axiom.
- FindEquationalProof[{expr1,expr2,…},{axm1,axm2,…}] is equivalent to FindEquationalProof[expr1&&expr2&&…,axm1&&axm2&&…].
- FindEquationalProof[thm,"theory"] is equivalent to FindEquationalProof[thm,AxiomaticTheory["theory"]].
- FindEquationalProof["name","theory"] tries to find a proof of the named theorem from AxiomaticTheory["theory","NotableTheorems"].
- FindEquationalProof has the following option:
-
TimeConstraint Infinity how much time to allow - If FindEquationalProof exceeds the specified time constraint, it returns a Failure object.
- FindEquationalProof[thm,axms] uses the Knuth–Bendix completion algorithm to prove that the theorem thm follows from the axioms axms.
Examples
open all close allBasic Examples (3)
Prove an elementary theorem in propositional logic:
proof = FindEquationalProof[a == c, {a == b, b == c}]Show the abstract proof network, with tooltips showing the intermediate expressions:
proof["ProofGraph"]Show the complete list of proof steps as a Dataset object:
proof["ProofDataset"]Prove a theorem involving universal quantification in first-order logic:
proof = FindEquationalProof[ForAll[x, f[g[x]] == g[f[x]]], ForAll[x, f[x] == g[x]]]Typeset a natural language argument:
proof["ProofNotebook"]FindEquationalProof[mortal[socrates], {ForAll[x, Implies[man[x], mortal[x]]], man[socrates]}]Scope (3)
Prove an elementary theorem from a list of axioms:
FindEquationalProof[a == d, {a == b, b == c, c == d}]Express the theorems as a conjunction:
FindEquationalProof[a == d, a == b && b == c && c == d]Show that an equational proposition cannot be derived from another:
FindEquationalProof[a == c, a == b]Proof a syllogism in predicate logic using existential quantifiers:
FindEquationalProof[Exists[x, Mortal[x]], {ForAll[x, Implies[Man[x], Mortal[x]]], Exists[x, Man[x]]}]Options (1)
TimeConstraint (1)
Use TimeConstraintt to limit the computation time to t seconds:
theorem = ForAll[{a, b, c}, f[a, f[a, f[b, c]]] == f[b, f[b, f[a, c]]]]axiom = ForAll[{a, b, c}, f[f[a, a], f[a, a]] == a && f[a, f[b, f[b, b]]] == f[a, a] && f[f[a, f[b, c]], f[a, f[b, c]]] == f[f[f[b, b], a], f[f[c, c], a]]]FindEquationalProof[theorem, axiom, TimeConstraint -> 1]By default, FindEquationalProof looks for a proof indefinitely:
FindEquationalProof[theorem, axiom]//AbsoluteTimingApplications (19)
Basic Logic (6)
Specify a choice of axioms for Boolean logic:
booleanLogic = {ForAll[{a, b}, and[a, b] == and[b, a]], ForAll[{a, b}, or[a, b] == or[b, a]], ForAll[{a, b}, and[a, or[b, not[b]]] == a], ForAll[{a, b}, or[a, and[b, not[b]]] == a], ForAll[{a, b, c}, and[a, or[b, c]] == or[and[a, b], and[a, c]]], ForAll[{a, b, c}, or[a, and[b, c]] == and[or[a, b], or[a, c]]]}Prove a theorem in Boolean logic:
proof = FindEquationalProof[ForAll[{a, b}, or[not[or[not[a], b]], not[or[not[a], not[b]]]] == a], booleanLogic]Show the abstract proof network:
proof["ProofGraph"]Prove another theorem in Boolean logic:
proof2 = FindEquationalProof[ForAll[{a, b}, not[or[not[or[a, b]], not[or[a, not[b]]]]] == a], booleanLogic]Build and run the associated proof function:
proof2["ProofFunction"][]Specify the axioms of Sheffer logic:
shefferLogic = {ForAll[a, nand[nand[a, a], nand[a, a]] == a], ForAll[{a, b}, nand[a, nand[b, nand[b, b]]] == nand[a, a]], ForAll[{a, b, c}, nand[nand[a, nand[b, c]], nand[a, nand[b, c]]] == nand[nand[nand[b, b], a], nand[nand[c, c], a]]]}Prove a theorem in Sheffer logic:
proof = FindEquationalProof[ForAll[{a, b}, nand[a, nand[a, b]] == nand[a, nand[b, b]]], shefferLogic]proof["ProofDataset"]Prove another theorem in Sheffer logic:
proof2 = FindEquationalProof[ForAll[{a, b}, nand[nand[a, a], nand[a, b]] == a], shefferLogic]Build and run the associated proof function:
proof2["ProofFunction"][]Prove a third theorem in Sheffer logic:
proof3 = FindEquationalProof[ForAll[{a, b, c}, nand[nand[nand[a, b], c], nand[a, nand[nand[a, c], a]]] == c], shefferLogic]Show the abstract proof network:
proof3["ProofGraph"]Prove a final theorem in Sheffer logic:
proof4 = FindEquationalProof[ForAll[{a, b, c}, nand[a, nand[a, nand[b, c]]] == nand[b, nand[b, nand[a, c]]]], shefferLogic]Show the abstract proof network:
proof4["ProofGraph"]Define the axioms of Boolean logic, Huntington logic and Robbins logic:
booleanLogic = {ForAll[{a, b}, and[a, b] == and[b, a]], ForAll[{a, b}, or[a, b] == or[b, a]], ForAll[{a, b}, and[a, or[b, not[b]]] == a], ForAll[{a, b}, or[a, and[b, not[b]]] == a], ForAll[{a, b, c}, and[a, or[b, c]] == or[and[a, b], and[a, c]]], ForAll[{a, b, c}, or[a, and[b, c]] == and[or[a, b], or[a, c]]]}huntingtonLogic = {ForAll[{a, b}, or[a, b] == or[b, a]], ForAll[{a, b, c}, or[a, or[b, c]] == or[or[a, b], c]], ForAll[{a, b}, or[not[or[not[a], b]], not[or[not[a], not[b]]]] == a]}robbinsLogic = {ForAll[{a, b}, or[a, b] == or[b, a]], ForAll[{a, b, c}, or[a, or[b, c]] == or[or[a, b], c]], ForAll[{a, b}, not[or[not[or[a, b]], not[or[a, not[b]]]]] == a]}Prove that the axioms of Huntington logic follow from the axioms of Boolean logic:
FindEquationalProof[huntingtonLogic, booleanLogic]Prove that the axioms of Robbins logic follow from the axioms of Boolean logic:
FindEquationalProof[robbinsLogic, booleanLogic]Prove that the axioms of Robbins logic follow from the axioms of Huntington logic:
FindEquationalProof[robbinsLogic, huntingtonLogic]Define Wolfram's shortest-possible axiom for Boolean algebra:
wolframLogic = ForAll[{a, b, c}, ((a·b)·c)·(a·((a·c)·a)) == c]Prove commutativity of the logical operator Nand:
FindEquationalProof[a·b == b·a, wolframLogic]%["ProofGraph"]Use the Wolfram axiom to prove the Boolean axioms by introducing the And, Or, Not operators via ancillary definitions:
ancillary = AxiomaticTheory["WolframAxioms", "AncillaryDefinitions"]FindEquationalProof[AxiomaticTheory["BooleanAxioms"], Join[AxiomaticTheory["WolframAxioms"], Values[ancillary]]]Use the Wolfram axiom to prove the Or-Not Boolean axiom by introducing the Or, Not operators via ancillary definitions:
theorem = AxiomaticTheory["OrNotBooleanAxioms"]ancillary = AxiomaticTheory["WolframAxioms", "AncillaryDefinitions"]FindEquationalProof[theorem, Join[AxiomaticTheory["WolframAxioms"], Values[ancillary]]]Abstract Algebra (8)
Specify the axioms of group theory:
groupTheory = {ForAll[{a, b, c}, g[a, g[b, c]] == g[g[a, b], c]], ForAll[a, g[a, e] == a], ForAll[a, g[a, inv[a]] == e]}Prove the existence of the left identity:
proof = FindEquationalProof[ForAll[x, g[e, x] == x], groupTheory]Typeset a natural language argument:
proof["ProofNotebook"]Prove a more sophisticated theorem in group theory:
proof2 = FindEquationalProof[ForAll[{a, b, c, d}, g[a, inv[g[b, g[g[g[c, inv[c]], inv[g[d, b]]], a]]]] == d], groupTheory]Show the abstract proof network:
proof2["ProofGraph"]Specify the axioms of Abelian group theory:
abelianGroupTheory = {ForAll[{a, b, c}, g[a, g[b, c]] == g[g[a, b], c]], ForAll[a, g[a, e] == a], ForAll[a, g[a, inv[a]] == e], ForAll[{a, b}, g[a, b] == g[b, a]]}Prove a theorem in Abelian group theory:
proof = FindEquationalProof[ForAll[{a, b, c}, g[g[g[a, b], c], inv[g[a, c]]] == b], abelianGroupTheory]proof["ProofDataset"]Prove another theorem in Abelian group theory:
proof2 = FindEquationalProof[ForAll[{a, b, c, d}, g[a, inv[g[b, g[g[g[c, inv[c]], inv[g[d, b]]], a]]]] == d], abelianGroupTheory]Show the abstract proof network:
proof2["ProofGraph"]Define the axioms of semigroup theory, monoid theory and group theory:
semigroupTheory = ForAll[{a, b, c}, g[a, g[b, c]] == g[g[a, b], c]]monoidTheory = {ForAll[{a, b, c}, g[a, g[b, c]] == g[g[a, b], c]], ForAll[a, g[a, e] == a], ForAll[a, g[e, a] == a]}groupTheory = {ForAll[{a, b, c}, g[a, g[b, c]] == g[g[a, b], c]], ForAll[a, g[a, e] == a], ForAll[a, g[a, inv[a]] == e]}Prove that every group is a semigroup:
FindEquationalProof[semigroupTheory, groupTheory]Prove that every group is a monoid:
FindEquationalProof[monoidTheory, groupTheory]Define the axioms of Abelian group theory and ring theory:
abelianGroupTheory = {ForAll[{a, b, c}, g[a, g[b, c]] == g[g[a, b], c]], ForAll[a, g[a, e] == a], ForAll[a, g[a, inv[a]] == e], ForAll[{a, b}, g[a, b] == g[b, a]]}ringTheory = {ForAll[{a, b, c}, g[a, g[b, c]] == g[g[a, b], c]], ForAll[a, g[a, e] == a], ForAll[a, g[a, inv[a]] == e], ForAll[{a, b}, g[a, b] == g[b, a]], ForAll[{a, b, c}, f[a, f[b, c]] == f[f[a, b], c]], ForAll[{a, b, c}, f[a, g[b, c]] == g[f[a, b], f[a, c]]], ForAll[{a, b}, f[a, b] == f[b, a]]}Prove that every ring is an Abelian group:
FindEquationalProof[abelianGroupTheory, ringTheory]["ProofGraph"]Take the axioms of group theory, using p as product and e as identity element:
groups = AxiomaticTheory[{"GroupAxioms", "Multiplication" -> p, "Identity" -> e}]Add the relations generating the quaternion group from two of its eight elements:
quaternionGroup = {groups, p[p[a, b], a] == b, p[p[b, a], b] == a};Prove other relations in the group:
FindEquationalProof[p[a, a] == p[b, b], quaternionGroup]FindEquationalProof[p[p[p[a, a], a], a] == e, quaternionGroup]FindEquationalProof[p[p[p[b, b], b], b] == e, quaternionGroup]The axioms of field theory include the existence of multiplicative right inverses:
AxiomaticTheory["FieldAxioms", "AxiomsAssociation"]["MultiplicationInverse"]They are also left inverses because the product is commutative:
FindEquationalProof[ForAll[, Implies[Not[Tilde[, OverTilde[0]]], Tilde[CircleTimes[SuperMinus[], ], OverTilde[1]]]], "FieldAxioms"]Show the axioms of right-near rings from those of left-near rings by specifying that the product is commutative:
FindEquationalProof[AxiomaticTheory["RightNearRingAxioms"], Join[AxiomaticTheory["LeftNearRingAxioms"], {ForAll[{, }, CircleTimes[, ] == CircleTimes[, ]]}]]Construct the axioms of an idempotent semiring with a naturally defined partial order denoted by LeftTriangle:
axioms = Join[AxiomaticTheory["SemiringAxioms"] /. Equal -> Tilde, {Subscript[∀, ]∼, Subscript[∀, {, }](∼∼), Subscript[∀, {, , }](∼ && ∼∼), ForAll[, Tilde[CirclePlus[, ], ]], ForAll[{, }, Implies[LeftTriangle[, ], Tilde[CirclePlus[, ], ]]], ForAll[{, }, Implies[Tilde[CirclePlus[, ], ], LeftTriangle[, ]]]}]Prove that the partial order is antisymmetric:
theorem = ForAll[{, }, Implies[And[LeftTriangle[, ], LeftTriangle[, ]], Tilde[, ]]]FindEquationalProof[theorem, axioms]Arithmetic (1)
Specify some axioms for a modified (equational) version of Presburger arithmetic:
presburgerArithmetic = {ForAll[x, plus[x, 0] == x], ForAll[x, plus[x, neg[x]] == 0], ForAll[{x, y, z}, plus[plus[x, y], z] == plus[x, plus[y, z]]]}Prove the double-negation theorem in Presburger arithmetic:
proof = FindEquationalProof[ForAll[x, neg[neg[x]] == x], presburgerArithmetic]Show the abstract proof network:
proof["ProofGraph"]Prove a theorem regarding the addition operator in Presburger arithmetic:
proof2 = FindEquationalProof[ForAll[{x, y}, plus[x, plus[y, 0]] == plus[x, plus[0, y]]], presburgerArithmetic]proof2["ProofDataset"]Real Analysis (1)
These axioms specify the fundamental theorem of calculus, the product rule and the linearity of differentiation:
calculus = {ForAll[f, integral[derivative[f]] == f], ForAll[f, derivative[integral[f]] == f], ForAll[{f, g}, derivative[product[f, g]] == sum[product[f, derivative[g]], product[g, derivative[f]]]], ForAll[{f, g}, derivative[sum[f, g]] == sum[derivative[f], derivative[g]]]}Prove the integration by parts formula:
proof = FindEquationalProof[ForAll[{f, g}, sum[integral[product[f, derivative[g]]], integral[product[g, derivative[f]]]] == product[f, g]], calculus]Typeset a natural language argument:
proof["ProofNotebook"]Loop Theory and Universal Algebra (1)
These axioms describe a loop whose group of inner automorphisms is Abelian:
loopTheory = {ForAll[x, mult[x, 1] == x], ForAll[x, mult[1, x] == x], ForAll[{x, y}, mult[x, conj[x, y]] == y], ForAll[{x, y, z}, R[x, y, z] == z], ForAll[{x, y, z, u}, T[x, R[y, z, u]] == R[y, z, T[x, y]]], ForAll[{x, y}, T[x, y] == conj[x, mult[y, x]]]}Prove that the nilpotency class of this loop is less than or equal to 3:
proof = FindEquationalProof[ForAll[{x, y, z, u, v}, mult[comm[x, assc[y, z, u]], v] == mult[v, comm[x, assc[y, z, u]]]], loopTheory]proof["ProofDataset"]Logic Puzzles (2)
Conclude, following Lewis Carroll, that babies cannot manage crocodiles:
FindEquationalProof[Not[Exists[x, And[baby[x], manageCrocodile[x]]]], {ForAll[x, Implies[baby[x], Not[logical[x]]]], ForAll[x, Implies[manageCrocodile[x], Not[despised[x]]]], ForAll[x, Implies[Not[logical[x]], despised[x]]]}]Check the solution of a knights (who always tell the truth) and knaves (who always lie) puzzle:
FindEquationalProof[And[knight[zoey], knave[mel]], {ForAll[p, ForAll[s, Implies[And[knight[p], says[p, s]], s]]], ForAll[p, ForAll[s, Implies[And[knave[p], says[p, s]], Not[s]]]], ForAll[p, Or[knight[p], knave[p]]], says[zoey, knave[mel]], says[mel, And[Not[knave[zoey]], Not[knave[mel]]]]}]Properties & Relations (2)
If FindEquationalProof returns a proof object for a particular theorem, then FullSimplify will return True for that theorem:
FindEquationalProof[f[f[u, f[v, w]], u] == f[u, f[f[v, w], u]], ForAll[{a, b, c}, f[a, f[b, c]] == f[f[a, b], c]]]FullSimplify[f[f[u, f[v, w]], u] == f[u, f[f[v, w], u]], ForAll[{a, b, c}, f[a, f[b, c]] == f[f[a, b], c]]]FindEquationalProof treats lists of axioms and conjunctions of axioms as equivalent:
FindEquationalProof[a == c, {a == b, b == c}]FindEquationalProof[a == c, a == b && b == c]The same is true for hypotheses:
FindEquationalProof[{a == c, a == d}, {a == b, b == c, c == d}]FindEquationalProof[a == c && a == d, a == b && b == c && c == d]Possible Issues (1)
FindEquationalProof cannot prove theorems involving arithmetic operators by default:
FindEquationalProof[ForAll[x, f[4 * x] == 4 * f[x]], {ForAll[x, f[2 * x] == 2 * f[x]]}]Prove the result by specifying the properties of multiplication:
FindEquationalProof[ForAll[a, f[mult[4, x]] == mult[4, f[x]]], {ForAll[x, f[mult[2, x]] == mult[2, f[x]]], ForAll[{x, y, z}, mult[x, mult[y, z]] == mult[mult[x, y], z]], mult[2, 2] == 4}]Related Guides
Related Links
Text
Wolfram Research (2018), FindEquationalProof, Wolfram Language function, https://reference.wolfram.com/language/ref/FindEquationalProof.html (updated 2020).
CMS
Wolfram Language. 2018. "FindEquationalProof." Wolfram Language & System Documentation Center. Wolfram Research. Last Modified 2020. https://reference.wolfram.com/language/ref/FindEquationalProof.html.
APA
Wolfram Language. (2018). FindEquationalProof. Wolfram Language & System Documentation Center. Retrieved from https://reference.wolfram.com/language/ref/FindEquationalProof.html
BibTeX
@misc{reference.wolfram_2026_findequationalproof, author="Wolfram Research", title="{FindEquationalProof}", year="2020", howpublished="\url{https://reference.wolfram.com/language/ref/FindEquationalProof.html}", note=[Accessed: 13-June-2026]}
BibLaTeX
@online{reference.wolfram_2026_findequationalproof, organization={Wolfram Research}, title={FindEquationalProof}, year={2020}, url={https://reference.wolfram.com/language/ref/FindEquationalProof.html}, note=[Accessed: 13-June-2026]}