The information required to record a derivation is, minimally, the leaf formulae, and each inferred formula with references to its parent formulae. More detailed information that might be recorded and useful includes: the role of each formula; the name of the inference rule used in each inference step; sufficient details of each inference step to deterministically reproduce the inference; the semantic relationships of inferred formulae with respect to their parents.
The TPTP format requires certain of these features to be acceptable (expressed as "must" in the documentation below), and other features are desirable to be nice (expressed as "should" in the documentation below) and highlighted with a ✅. ATP systems might usefully offer a flag to indicate whether just an acceptable derivation is required, or a nice derivation.
language(name,role,formula,source,useful info). A derivation is written in the TPTP language as a list of annotated formulae. Derivations should✅ show only inference steps that are relevant, i.e., in the DAG from leaves to a root.
Sources:
fof(john,axiom,
human(john),
file('CreatedEqual.p',john) ).
fof(64,definition,
( sP1 <=> ! [X8] : ~ has_job(X8,boxer) ),
introduced(definition,[new_symbols(definition,[sP1])],[])).
Definitions that introduce a new symbol must be recorded in
this form of annotated formula.
See the conventions for new symbol names.
cnf(c_0_20,negated_conjecture,
sK0 = john,
inference(cn,[status(thm)],[inference(rw,[status(thm)],[c_0_16,c_0_17])]) ).
Common types of useful inference information are:
Examples
Plain example, single steps:
Plain example, multiple steps:
ε-term example:
Choice axiom example:
If you are interested in the history and motivations behind this convention, read the source
of this web page.
You can download and install TPTP4X on your own Linux computer, from
Github.
You must get the JJParser submodule too, i.e.,
You can verify a derivation using GDV, also available in
SystemOnTSTP.
Select the "TSTP formulae" option and paste the formulae into the text box.
Select "GDV" as the system, and ensure that the "Output mode" is "System".
Click "ProcessSolution".
It might take a while for output to appear.
If the derivation is dubious or faulty, you'll get an WARNING/ERROR messages.
You can download and install GDV on your own Linux computer, from
Github.
You must get the JJParser submodule too, i.e.,
For more information about GDV, you can read ...
Definitions
Definitions that introduce new symbols must the following form:
tff(square,definition,
! [I: $int] :
( square(I) = $product(I,I) ),
introduced(definition,[new_symbols(definition,[square])],[])).
fof(pugalist,definition,
( no_fighters <=> ! [X] : ~ has_job(X,boxer) ),
introduced(definition,[new_symbols(definition,[no_fighters])],[])).
tff(bad_cat,definition,
! [C: cat] :
( ~ friendly(C) <=> ( horrible(C) & bad_pet(C) ) ),
introduced(definition,[new_symbols(definition,[friendly])],[])).
Skolemization
Optimally, each Skolemization step of one existentially quantified variable should be
performed and recorded in separate annotated formulae.
However, it is possible to record multiple Skolemization steps in one annotated formula.
So far three variants have emerged, each of which has particular output requirements.
%----Starting formula
fof(marriage,plain,
! [Marriage] :
? [Bride] :
? [Groom] :
in_love(Groom,Bride) ).
%----Skolemize Bride
fof(bride,plain,
! [Marriage] :
? [Groom] :
in_love(Groom,sK0(Marriage)),
inference(skolemize,[status(esa),new_symbols(skolem,[sK0]),skolemize(Bride,sK0(Marriage))],[marriage]) ).
%----Skolemize Groom
fof(groom,plain,
! [Marriage] :
in_love(sK1(Marriage),sK0(Marriage)),
inference(skolemize,[status(esa),new_symbols(skolem,[sK1]),skolemize(Groom,sK1(Marriage))],[bride]) ).
%----Starting formula
fof(marriage,plain,
! [Marriage] :
? [Bride] :
? [Groom] :
in_love(Groom,Bride) ).
%----Skolemize Bride and Groom
fof(groom,plain,
! [Marriage] :
in_love(sK1(Marriage),sK0(Marriage)),
inference(skolemize,[status(esa),new_symbols(skolem,[sk0,sK1]),skolemize(Bride,sK0(Marriage)),skolemize(Groom,sK1(Marriage))],[marriage]) ).
For people who justify Skolemization with an ε-term.
%----Starting formula
fof(marriage,plain,
! [Marriage] :
? [Bride] :
? [Groom] :
in_love(Groom,Bride) ).
%----New symbol sK0 recorded here in the definition of the ε term. Default typing with $i.
tff(sK0_defn,definition,
! [Marriage] :
( sK0(Marriage)
= ( # [Bride] :
? [Groom] : in_love(Groom,Bride) ) ),
introduced(definition,[new_symbols(skolem,[sK0])],[marriage]) ).
%----Skolemize Bride
fof(bride,plain,
! [Marriage] :
? [Groom] :
in_love(Groom,sK0(Marriage)),
inference(skolemize,[status(esa),skolemize(Bride,sK0(Marriage))],[marriage,sK0_defn]) ).
tff(sK1_defn,definition,
! [Marriage: $i] :
( sK1(Marriage)
= ( # [Groom: $i] : in_love(Groom,sK1(Marriage)) ) ),
introduced(definition,[new_symbols(skolem,[sK1])],[bride]) ).
%----Skolemize Groom
fof(groom,plain,
! [Marriage] :
in_love(sK1(Marriage),sK0(Marriage)),
inference(skolemize,[status(esa),skolemize(Groom,sK1(Marriage))],[bride,sK1_defn]) ).
For people who believe that its just fine to output a "choice axiom" to justify a Skolemization
step.
%----Starting formula
fof(marriage,plain,
! [Marriage] :
? [Bride] :
? [Groom] :
in_love(Groom,Bride) ).
%----Skolemize Bride
fof(bride,plain,
! [Marriage] :
? [Groom] :
in_love(Groom,sK0(Marriage)),
inference(skolemize,[status(thm),new_symbols(skolem,[sK0]),skolemize(Bride,sK0(Marriage))],[gift_of_choice_sK0,marriage]) ).
%----Choice axiom
fof(gift_of_choice_sK0,axiom,
( ! [Marriage] :
? [Bride] :
? [Groom] :
in_love(Groom,Bride)
=> ! [Marriage] :
? [Groom] :
in_love(Groom,sK0(Marriage)) ),
introduced(choice_axiom,[],[]) ).
%----Skolemize Groom
fof(groom,plain,
! [Marriage] :
in_love(sK1(Marriage),sK0(Marriage)),
inference(skolemize,[status(thm),new_symbols(skolem,[sK1]),skolemize(Groom,sK1(Marriage))],[bride,gift_of_choice_sk1]) ).
fof(gift_of_choice_sk1,axiom,
( ! [Marriage] :
? [Groom] :
in_love(Groom,sK0(Marriage))
=> ! [Marriage] :
in_love(sK1(Marriage),sK0(Marriage)) ),
introduced(choice_axiom,[],[]) ).
New Symbol Names
New symbols may be introduced in derivations, e.g., to provide definitions for complex terms
and formulae, in Skolemization and Herbrandization, in splitting.
These conventions provide guidelines for reasonable naming of such symbols, and spefiy how the
new symbols must be introduced in inference() and introduced() records.
fof(bride,plain,
! [Marriage] :
? [Groom] :
in_love(Groom,sK0(Marriage)),
inference(skolemize,[status(esa),new_symbols(skolem,[sK0]),skolemize(Bride,sK0(Marriage))],[marriage]) ).
fof(pugalist,definition,
( no_fighters <=> ! [X] : ~ has_job(X,boxer) ),
introduced(definition,[new_symbols(definition,[no_fighters])],[])).
Example Derivation
Consider the toy FOF problem in the problem quick guide.
Here is a derivation recording a proof by refutation of the CNF (adapted from the one produced
by the ATP system E):
%------------------------------------------------------------------------------
fof(someone_not_john,conjecture,
? [X3] :
( human(X3)
& created_equal(X3,john)
& X3 != john ),
file('CreatedEqual.p',someone_not_john) ).
fof(all_created_equal,axiom,
! [X1,X2] :
( ( human(X1)
& human(X2) )
=> created_equal(X1,X2) ),
file('CreatedEqual.p',all_created_equal) ).
fof(someone_got_an_a,axiom,
? [X3] :
( human(X3)
& grade(X3) = a ),
file('CreatedEqual.p',someone_got_an_a) ).
fof(john,axiom,
human(john),
file('CreatedEqual.p',john) ).
fof(distinct_grades,axiom,
a != f,
file('CreatedEqual.p',distinct_grades) ).
fof(john_failed,axiom,
grade(john) = f,
file('CreatedEqual.p',john_failed) ).
fof(c_0_6,negated_conjecture,
~ ? [X3] :
( human(X3)
& created_equal(X3,john)
& X3 != john ),
inference(fof_simplification,[status(thm)],[inference(assume_negation,[status(cth)],[someone_not_john])]) ).
fof(c_0_7,plain,
! [X6,X7] :
( ~ human(X6)
| ~ human(X7)
| created_equal(X6,X7) ),
inference(fof_nnf,[status(thm)],[inference(variable_rename,[status(thm)],[inference(fof_nnf,[status(thm)],[all_created_equal])])]) ).
fof(c_0_8,negated_conjecture,
! [X5] :
( ~ human(X5)
| ~ created_equal(X5,john)
| X5 = john ),
inference(fof_nnf,[status(thm)],[inference(variable_rename,[status(thm)],[inference(fof_nnf,[status(thm)],[c_0_6])])]) ).
%----If E believed in epsilon terms ...
% tff(sK0_defn,definition,
% ( sK0
% = ( # [X3: $i] :
% ( human(X3)
% & ( grade(X3) = a ) ) ) ),
% introduced(definition,[new_symbols(skolem,[sK0])],[someone_got_an_a]) ).
fof(c_0_9,plain,
( human(sK0)
& grade(sK0) = a ),
inference(skolemize,[status(esa),new_symbols(skolem,[sK0]),skolemize(X3,sK0)],[someone_got_an_a]) ).
cnf(c_0_10,plain,
( created_equal(X1,X2)
| ~ human(X1)
| ~ human(X2) ),
inference(split_conjunct,[status(thm)],[c_0_7]) ).
cnf(c_0_11,plain,
human(john),
inference(split_conjunct,[status(thm)],[john]) ).
cnf(c_0_12,negated_conjecture,
( X1 = john
| ~ human(X1)
| ~ created_equal(X1,john) ),
inference(split_conjunct,[status(thm)],[c_0_8]) ).
cnf(c_0_13,plain,
human(sK0),
inference(split_conjunct,[status(thm)],[c_0_9]) ).
cnf(c_0_14,plain,
( created_equal(X1,john)
| ~ human(X1) ),
inference(spm,[status(thm)],[c_0_10,c_0_11]) ).
fof(c_0_15,plain,
a != f,
inference(fof_simplification,[status(thm)],[distinct_grades]) ).
cnf(c_0_16,negated_conjecture,
( sK0 = john
| ~ created_equal(sK0,john) ),
inference(spm,[status(thm)],[c_0_12,c_0_13]) ).
cnf(c_0_17,plain,
created_equal(sK0,john),
inference(spm,[status(thm)],[c_0_14,c_0_13]) ).
fof(c_0_18,plain,
a != f,
inference(fof_nnf,[status(thm)],[c_0_15]) ).
cnf(c_0_19,plain,
grade(sK0) = a,
inference(split_conjunct,[status(thm)],[c_0_9]) ).
cnf(c_0_20,negated_conjecture,
sK0 = john,
inference(cn,[status(thm)],[inference(rw,[status(thm)],[c_0_16,c_0_17])]) ).
cnf(c_0_21,plain,
grade(john) = f,
inference(split_conjunct,[status(thm)],[john_failed]) ).
cnf(c_0_22,plain,
a != f,
inference(split_conjunct,[status(thm)],[c_0_18]) ).
cnf(c_0_23,plain,
$false,
inference(sr,[status(thm)],[inference(rw,[status(thm)],[inference(rw,[status(thm)],[c_0_19,c_0_20]),c_0_21]),c_0_22]),
[proof] ).
%------------------------------------------------------------------------------
Checking a Derivation
To check the syntax of a derivation you can run it through tptp4X, available in
SystemOnTSTP.
Select the "TSTP formulae" option and paste the formulae into the text box.
Select "TPTP4X" as the system, and ensure that the "Output mode" is "System".
Click "ProcessSolution".
If the syntax is faulty you'll get an error massage.
git clone --recurse-submodules https://github.com/TPTPWorld/TPTP4X.
git clone --recurse-submodules https://github.com/TPTPWorld/GDV.git.
@Article{Sut06,
Author = "Sutcliffe, G.",
Year = "2006",
Title = "{Semantic Derivation Verification}",
Journal = "International Journal on Artificial Intelligence Tools",
Volume = "15",
Number = "6",
Pages = "1053-1070"
}