Expand description
§Pocket-Prover
A fast, brute force, automatic theorem prover for first order logic
- For generic automated theorem proving, see monotonic_solver
- For a debuggable SAT solver, see debug_sat
extern crate pocket_prover;
use pocket_prover::*;
fn main() {
println!("Socrates is mortal: {}", prove!(&mut |man, mortal, socrates| {
// Using `imply` because we want to prove an inference rule.
imply(
// Premises.
and(
// All men are mortal.
imply(man, mortal),
// Socrates is a man.
imply(socrates, man),
),
// Conclusion.
imply(socrates, mortal)
)
}));
}
§Motivation
The motivation is to provide the analogue of a “pocket calculator”, but for logic, therefore called a “pocket prover”.
This library uses an approach that is simple to implement from scratch in a low level language.
This is useful in cases like:
- Study logic without the hurdle of doing manual proofs
- Checking your understanding of logic
- Verify that logicians are wizards and not lizards
- Due to a series of unfortunate events, you got only 24 hours to learn logic and just need the gist of it
- Memorizing source code for situations like The Martian
- A tiny mistake and the whole planet blows up (e.g. final decisions before the AI singularity and you need to press the right buttons)
In addition this library can be used to create extensible logical systems.
For more information, see the Prove
trait.
§Implementation
This library uses brute-force to check proofs, instead of relying on axioms of logic.
64bit CPUs are capable of checking logical proofs of 6 arguments (booleans)
in O(1), because proofs can be interpreted as tautologies (true for all input)
and 2^6 = 64
.
This is done by replacing bool
with u64
and organizing inputs
using bit patterns that simulate a truth table of 6 arguments.
To extend to 10 arguments, T
and F
are used to alternate the 4 extra arguments.
To extend to N arguments, recursive calls are used down to less than 10 arguments.
§Path Semantical Logic
Notice! Path Semantical Logic is at early stage of research.
This library has experimental support for a subset of Path Semantical Logic. Implementation is based on paper Faster Brute Force Proofs.
Path Semantical Logic separates propositions into levels, such that an equality between two propositions in level N+1, propagates into equality between uniquely associated propositions in level N.
For example, if f
has level 1 and x
has level 0,
then imply(f, x)
associates x
uniquely with f
,
such that the core axiom of Path Semantics
is satisfied.
This library has currently only support for level 1 and 0.
These functions are prefixed with path1_
.
The macros count!
and prove!
will automatically expand
to path1_count!
and path1_prove!
.
Each function takes two arguments, consisting of tuples of propositions, e.g. (f, g), (x, y)
.
Arbitrary number of arguments is supported.
extern crate pocket_prover;
use pocket_prover::*;
fn main() {
println!("=== Path Semantical Logic ===");
println!("The notation `f(x)` means `x` is uniquely associated with `f`.");
println!("For more information, see the section 'Path Semantical Logic' in documentation.");
println!("");
print!("(f(x), g(y), h(z), f=g ⊻ f=h) => (x=y ∨ x=z): ");
println!("{}\n", prove!(&mut |(f, g, h), (x, y, z)| {
imply(
and!(
imply(f, x),
imply(g, y),
imply(h, z),
xor(eq(f, g), eq(f, h))
),
or(eq(x, y), eq(x, z))
)
}));
print!("(f(x), g(y), f=g => h, h(z)) => (x=y => z): ");
println!("{}\n", prove!(&mut |(f, g, h), (x, y, z)| {
imply(
and!(
imply(f, x),
imply(g, y),
imply(eq(f, g), h),
imply(h, z)
),
imply(eq(x, y), z)
)
}));
}
§Path Semantical Quality
Pocket-Prover has a model of Path Semantical Quality that resembles quantum logic.
To write x ~~ y
you use q(x, y)
or qual(x, y)
.
q(x, y)
is the same as and!(eq(x, y), qubit(x), qubit(y))
.
q(x, x)
is the same as qubit(x)
.
A qubit is a kind of “superposition”.
One can also think about it as introducing a new argument qubit(x)
that depends on x
.
Since qubits can collide with other propositions,
one must repeat measurements e.g. using measure
to get classical states.
However, sometimes one might wish to amplify quantum states, using amplify
or amp
.
To use quality with path semantics, one should use ps_core
.
Path Semantical Logic is designed for equality, not quality.
use pocket_prover::*;
fn main() {
println!("Path semantics: {}", measure(1, || prove!(&mut |a, b, c, d| {
imply(
and!(
ps_core(a, b, c, d),
imply(a, c),
imply(b, d)
),
imply(qual(a, b), qual(c, d))
)
})));
}
Re-exports§
pub use qual as q;
pub use qubit as qu;
pub use aqual as aq;
pub use contra_qual as cq;
pub use platonic_qubit as pqu;
pub use amplify as amp;
Modules§
- extract
- Helper utilities for extracting data from proofs.
Macros§
- and
- An AND relation of variable arguments.
- bits
- Evaluates an expression for all bit configurations.
- bits_
format - Generates a “{}{}{}…” format for bits.
- contr
- Path Semantical Logic: A contractible “family of types”.
- count
- Counts the number of solutions of a variable argument boolean function.
- imply
- An IMPLY chain of variable arguments.
- or
- An OR relation of variable arguments.
- path1_
count - Path Semantical Logic: Counts the number of solutions of a variable argument boolean function.
- path1_
prove - Path Semantical Logic: Returns
true
if proposition is correct,false
otherwise. - println_
bits - Prints a truth table with result of a boolean expression.
- println_
extract - Prints a truth table extracted from a theory, assigning each case a bit and automatically flip expression properly.
- prove
- Returns
true
if proposition is correct,false
otherwise. - tup_
count - Helper macro for counting size of a tuple.
- tup_set
- Helper macro for binding to a tuple pattern.
- xor
- An XOR relation of variable arguments.
Constants§
- F
- The False proposition.
Used to alternate higher than 6 arguments, set to
0
. - P0
- 0xaaaa_aaaa_aaaa_aaaa
- P1
- 0xcccc_cccc_cccc_cccc
- P2
- 0xf0f0_f0f0_f0f0_f0f0
- P3
- 0xff00_ff00_ff00_ff00
- P4
- 0xffff_0000_ffff_0000
- P5
- 0xffff_ffff_0000_0000
- T
- The True proposition.
Used to alternate higher than 6 arguments, set to
1
.
Traits§
- Base
System - Implemented by base logical systems.
- Construct
- Used to construct logical systems.
- Core
Rules - Implemented by logical systems to define core rules.
- Enumerable
- Implemented by types to use with
all
andany
. - Extend
Rules - Implemented by logical systems to extend existing ones.
- Observable
- Implemented by observables.
- Prove
- Implemented by provable systems of logic.
Functions§
- all
- Enumerates the type, checking that all outputs are true.
- amplify
- Amplify a “wavefunction” of a proposition using its qubit transform.
- and
- Returns
true
if all arguments aretrue
. - and3
- An AND relation of 3 argument.
- and4
- An AND relation of 4 arguments.
- and5
- An AND relation of 5 arguments.
- and6
- An AND relation of 6 arguments.
- and7
- An AND relation of 7 arguments.
- and8
- An AND relation of 8 arguments.
- and9
- An AND relation of 9 arguments.
- and10
- An AND relation of 10 arguments.
- andn
- An AND relation of variable number of arguments.
- any
- Enumerates the type, checking that at least one output is true.
- aqual
- Path semantical aquality
a ~¬~ b
. - cont
- Path semantical continuous map
a ~> b
. - contra_
qual - Path semantical contravariant quality
a ¬~~ b
. - count1
- Counts the number of solutions of a 1-argument boolean function.
- count2
- Counts the number of solutions of a 2-argument boolean function.
- count3
- Counts the number of solutions of a 3-argument boolean function.
- count4
- Counts the number of solutions of a 4-argument boolean function.
- count5
- Counts the number of solutions of a 5-argument boolean function.
- count6
- Counts the number of solutions of a 6-argument boolean function.
- count7
- Counts the number of solutions of a 7-argument boolean function.
- count8
- Counts the number of solutions of an 8-argument boolean function.
- count9
- Counts the number of solutions of a 9-argument boolean function.
- count10
- Counts the number of solutions of a 10-argument boolean function.
- countn
- Counts the number of solutions of an n-argument boolean function.
- eq
- Returns
true
if arguments are equal. - false_1
- Ignores argument, always returning
false
. - false_2
- Ignores both arguments, returning
false
for all inputs. - false_3
- Ignores all 3 arguments, returning
false
for all inputs. - false_4
- Ignores all 4 arguments, returning
false
for all inputs. - false_5
- Ignores all 5 arguments, returning
false
for all inputs. - false_6
- Ignores all 6 arguments, returning
false
for all inputs. - false_7
- Ignores all 7 arguments, returning
false
for all inputs. - false_8
- Ignores all 8 arguments, returning
false
for all inputs. - false_9
- Ignores all 9 arguments, returning
false
for all inputs. - false_
10 - Ignores all 10 arguments, returning
false
for all inputs. - hom_and
- Aligns logical AND of qubits up to some homotopy level.
- hom_eq
- Aligns equality of qubits up to some homotopy level.
- hom_f
- Path semantical function
f_n(a, b)
up to some homotopy leveln
. - hom_
imply - Aligns implication of qubits up to some homotopy level.
- hom_or
- Aligns logical OR of qubits up to some homotopy level.
- hom_xor
- Aligns logical XOR of qubits up to some homotopy level.
- id
- Returns argument.
- imply
- First argument implies the second.
- imply3
- An IMPLY chain of 3 arguments.
- imply4
- An IMPLY chain of 4 arguments.
- imply5
- An IMPLY chain of 5 arguments.
- imply6
- An IMPLY chain of 6 arguments.
- imply7
- An IMPLY chain of 7 arguments.
- imply8
- An IMPLY chain of 8 arguments.
- imply9
- An IMPLY chain of 9 arguments.
- imply10
- An IMPLY chain of 10 arguments.
- implyn
- An IMPLY chain of variable number of arguments.
- is_
groupoid - Defines a groupoid relation from
x
toa
andb
. - is_
groupoid_ n - Defines an n-groupoid relation from
x
toa
andb
. - is_
hom_ lev_ n - Defines a homotopy level
n
relation fromx
toa
andb
. - is_prop
- Defines a proposition relation of proposition
x
to potential proofsa
andb
. - is_set
- Defines a set relation from a set
x
to potential membersa
andb
. - measure
- Measures result repeatedly.
- not
- If input is
true
, returnsfalse
and vice versa. - or
- Returns
true
if at least one argument istrue
. - or3
- An OR relation of 3 arguments.
- or4
- An OR relation of 4 arguments.
- or5
- An OR relation of 5 arguments.
- or6
- An OR relation of 6 arguments.
- or7
- An OR relation of 7 arguments.
- or8
- An OR relation of 8 arguments.
- or9
- An OR relation of 9 arguments.
- or10
- An OR relation of 10 arguments.
- orn
- An OR relation of variable number of arguments.
- path1_
count1 - Path Semantical Logic: Counts the number of solutions of a 1-argument boolean function,
- path1_
count2 - Path Semantical Logic: Counts the number of solutions of a 2-argument boolean function,
- path1_
count3 - Path Semantical Logic: Counts the number of solutions of a 3-argument boolean function,
- path1_
count4 - Path Semantical Logic: Counts the number of solutions of a 4-argument boolean function,
- path1_
count5 - Path Semantical Logic: Counts the number of solutions of a 5-argument boolean function,
- path1_
count6 - Path Semantical Logic: Counts the number of solutions of a 6-argument boolean function,
- path1_
count7 - Path Semantical Logic: Counts the number of solutions of a 7-argument boolean function,
- path1_
count8 - Path Semantical Logic: Counts the number of solutions of a 8-argument boolean function,
- path1_
count9 - Path Semantical Logic: Counts the number of solutions of a 9-argument boolean function,
- path1_
count10 - Path Semantical Logic: Counts the number of solutions of a 10-argument boolean function,
- path1_
countn - Path Semantical Logic: Counts the number of solutions of a n-argument boolean function,
- path1_
countnm - Path Semantical Logic: Counts the number of solutions of a n+m-argument boolean function,
- path1_
lennm - Path Semantical Logic: Computes number of cases.
- path1_
prove1 - Path Semantical Logic: Returns
true
if proposition is correct,false
otherwise. - path1_
prove2 - Path Semantical Logic: Returns
true
if proposition is correct,false
otherwise. - path1_
prove3 - Path Semantical Logic: Returns
true
if proposition is correct,false
otherwise. - path1_
prove4 - Path Semantical Logic: Returns
true
if proposition is correct,false
otherwise. - path1_
prove5 - Path Semantical Logic: Returns
true
if proposition is correct,false
otherwise. - path1_
prove6 - Path Semantical Logic: Returns
true
if proposition is correct,false
otherwise. - path1_
prove7 - Path Semantical Logic: Returns
true
if proposition is correct,false
otherwise. - path1_
prove8 - Path Semantical Logic: Returns
true
if proposition is correct,false
otherwise. - path1_
prove9 - Path Semantical Logic: Returns
true
if proposition is correct,false
otherwise. - path1_
prove10 - Path Semantical Logic: Returns
true
if proposition is correct,false
otherwise. - path1_
proven - Path Semantical Logic: Returns
true
if proposition is correct,false
otherwise. - path1_
provenm - Path Semantical Logic: Returns
true
if proposition is correct,false
otherwise. - platonic_
qubit - Prepares a platonic qubit using a proposition as seed.
- prop
- Returns
T
ifa
istrue
,F
otherwise. In logical terminology this corresponds to a proposition. - prove1
- Returns
true
if proposition is correct,false
otherwise. - prove2
- Returns
true
if proposition is correct,false
otherwise. - prove3
- Returns
true
if proposition is correct,false
otherwise. - prove4
- Returns
true
if proposition is correct,false
otherwise. - prove5
- Returns
true
if proposition is correct,false
otherwise. - prove6
- Returns
true
if proposition is correct,false
otherwise. - prove7
- Returns
true
if proposition is correct,false
otherwise. - prove8
- Returns
true
if proposition is correct,false
otherwise. - prove9
- Returns
true
if proposition is correct,false
otherwise. - prove10
- Returns
true
if proposition is correct,false
otherwise. - proven
- Returns
true
if proposition is correct,false
otherwise. - ps_
acore - Assumes the path semantical acore axiom.
- ps_
acore_ eq - Assumes a strong version of the path semantical acore axiom.
- ps_core
- Assumes the path semantical core axiom.
- ps_
core_ eq - Assumes a strong version of the path semantical core axiom.
- ps_
sym_ core - Assumes the symmetric path semantical core axiom.
- ps_
sym_ core_ eq - Assumes a strong version of the symmetric path semantical core axiom.
- qual
- Path semantical quality
a ~~ b
. - qubit
- Prepares a qubit using a proposition as seed.
- re_sesh
- Restore Sesh property to a proposition.
- true_1
- Ignores argument, always returning
true
. - true_2
- Ignores both arguments, returning
true
for all inputs. - true_3
- Ignores all 3 arguments, returning
true
for all inputs. - true_4
- Ignores all 4 arguments, returning
true
for all inputs. - true_5
- Ignores all 5 arguments, returning
true
for all inputs. - true_6
- Ignores all 6 arguments, returning
true
for all inputs. - true_7
- Ignores all 7 arguments, returning
true
for all inputs. - true_8
- Ignores all 8 arguments, returning
true
for all inputs. - true_9
- Ignores all 9 arguments, returning
true
for all inputs. - true_10
- Ignores all 10 arguments, returning
true
for all inputs. - un_sesh
- Removes Sesh property from a proposition.
- univ
- Assumes univalence axiom for some homotopy level.
- xor
- Returns
true
if only one argument istrue
. - xor3
- An XOR relation of 3 arguments.
- xor4
- An XOR relation of 4 arguments.
- xor5
- An XOR relation of 5 arguments.
- xor6
- An XOR relation of 6 arguments.
- xor7
- An XOR relation of 7 arguments.
- xor8
- An XOR relation of 8 arguments.
- xor9
- An XOR relation of 9 arguments.
- xor10
- An XOR relation of 10 arguments.
- xorn
- An XOR relation of variable number of arguments.