The TPTP language is sufficient for recording a finite interpretation. The domain, interpretation of functors, and interpretation of predicates, are written as FOF annotated formulae. A recorded interpretation provides the information required for various forms of processing, such as model verification, interpretation of formulae, and identification of isomorphic interpretations. The goals of the representation format are:
fof(fi_name,fi_domain, ! [X] : ( X = e1 | X = e2 | ... | X = en ) ).where the ei are all "distinct object"s, or all distinct integers, or all distinct constant terms. If "distinct object"s or integer terms appear in the interpreted signature, then all those terms must appear in the domain. If constant terms are used they are freely chosen constants that do not appear in the signature being interpreted. The ei values provide an exhaustive list of terms whose interpretation form the domain (there is a bijection from the terms to the domain, so one may think of the terms directly as the domain elements). The use of "distinct object"s or integer terms for a domain is preferred over constant terms, because it takes advantage of the predefined interpretation of such terms - all such terms and corresponding domain elements are known to be distinct. If the domain elements are constant terms then their inequality must be explicitly stated in annotated formulae of the form:
fof(ei_not_ej,fi_domain, ei != ej ).
fof(fi_name ,fi_functors, ( f(e1,...,em) = er & f(e1,...,ep) = es ... ) ).specifying that, e.g., f(e1,...,em) is interpreted as the domain element er. If "distinct object"s or integer terms appear in the interpreted signature, then those terms are necessarily interpreted as themselves and must not be interpreted in the fi_functors.
The interpretation of predicates is written in the form:
fof(fi_name ,fi_predicates, ( p(e1,...,em) & ~ p(e1,...,ep) ... ) ).specifying that, e.g., p(e1,...,em) is interpreted as true and p(e1,...,ep) is interpreted as false. Equality is naturally interpreted by the domain, with the understanding that identical elements are equal.
%----All (hu)men are created equal. John is a human. John got an F grade. %----There is someone (a human) who got an A grade. An A grade is not %----equal to an F grade. Grades are not human. Therefore, it is not the %----case being created equal is the same as really being equal. fof(all_created_equal,axiom, ! [H1,H2] : ( ( human(H1) & human(H2) ) => created_equal(H1,H2) ) ). fof(john,axiom, human(john) ). fof(john_failed,axiom, grade(john) = f ). fof(someone_got_an_a,axiom, ? [H] : ( human(H) & grade(H) = a ) ). fof(distinct_grades,axiom, a != f ). fof(grades_not_human,axiom, ! [G] : ~ human(grade(G)) ). fof(equality_lost,conjecture, ! [H1,H2] : ( created_equal(H1,H2) <=> H1 = H2 ) ). %------------------------------------------------------------------------------Here is a model for the axioms and negated conjecture (adapted from the one found by Paradox 1.3):
%------------------------------------------------------------------------------ fof(equality_lost,interpretation_domain, ! [X] : ( X = "a" | X = "f" | X = "john" | X = "got_A") ). fof(equality_lost,interpretation_terms, ( a = "a" & f = "f" & john = "john" & grade("a") = "f" & grade("f") = "a" & grade("john") = "f" & grade("got_A") = "a" ) ). fof(equality_lost,interpretation_atoms, ( ~ human("a") & ~ human("f") & human("john") & human("got_A") & ~ created_equal("a","a") & ~ created_equal("a","f") & ~ created_equal("a","john") & ~ created_equal("a","got_A") & ~ created_equal("f","a") & ~ created_equal("f","f") & ~ created_equal("f","john") & ~ created_equal("f","got_A") & ~ created_equal("john","a") & ~ created_equal("john","f") & created_equal("john","john") & created_equal("john","got_A") & ~ created_equal("got_A","a") & ~ created_equal("got_A","f") & created_equal("got_A","john") & created_equal("got_A","got_A") ) ). %------------------------------------------------------------------------------Here's the same example using constant terms for domain elements:
%------------------------------------------------------------------------------ fof(equality_lost,interpretation_domain, ! [X] : ( X = e_a | X = e_f | X = e_john | X = e_got_A) ). fof(equality_lost,interpretation_domain, ( e_a != e_f & e_a != e_john & e_a != e_got_A & e_f != e_john & e_f != e_got_A & e_john != e_got_A ) ). fof(equality_lost,interpretation_terms, ( a = e_a & f = e_f & john = e_john & grade(e_a) = e_f & grade(e_f) = e_a & grade(e_john) = e_f & grade(e_got_A) = e_a ) ). fof(equality_lost,interpretation_atoms, ( ~ human(e_a) & ~ human(e_f) & human(e_john) & human(e_got_A) & ~ created_equal(e_a,e_a) & ~ created_equal(e_a,e_f) & ~ created_equal(e_a,e_john) & ~ created_equal(e_a,e_got_A) & ~ created_equal(e_f,e_a) & ~ created_equal(e_f,e_f) & ~ created_equal(e_f,e_john) & ~ created_equal(e_f,e_got_A) & ~ created_equal(e_john,e_a) & ~ created_equal(e_john,e_f) & created_equal(e_john,e_john) & created_equal(e_john,e_got_A) & ~ created_equal(e_got_A,e_a) & ~ created_equal(e_got_A,e_f) & created_equal(e_got_A,e_john) & created_equal(e_got_A,e_got_A) ) ). %------------------------------------------------------------------------------
It is recommended that interpretations follow a standard layout, as illustrated by the examples above. However, the conjuncts of function and predicate interpretations can also be separated into individual annotated formulae, and compact forms are possible using more complex formulae, e.g.,
fof(equality_lost,interpretation_atoms, ( ~ human("a") & ~ human("f") & human("john") & human("got_A") & ! [X] : ~ created_equal("a",X) & ! [X] : ~ created_equal("f",X) & ! [X] : ~ created_equal(X,"a") & ! [X] : ~ created_equal(X,"f") & created_equal("john","john") & created_equal("john","got_A") & created_equal("got_A","john") & created_equal("got_A","got_A") ) ).
! [X,Y] : ( p(X,Y) <=> ( ( X != a & Y != a ) | ( X = a & Y = a ) ) )There are decision procedures for the validity of ground atoms in the context of such formulae.