The syntax for atoms is that of Prolog: variables start with upper case letters, atoms and terms are written in prefix notation, uninterpreted predicates and functors either start with lower case and contain alphanumerics and underscore, or are in 'single quotes'. The language also supports interpreted predicates and functors. These come in two varieties: defined predicates and functors, whose interpretation is specified by the TPTP language, and system predicates and functors, whose interpretation is ATP system specific. Interpreted predicates and functors are syntactically distinct from uninterpreted ones  they are = and !=, or start with a $, a ", or a digit. Nonvariable symbols can be given a type globally, in the formula with role type. The defined types are $o  the Boolean type, $i  the type of individuals, $real  the type of reals, $rat  the type of rational, and $int  the type of integers. New types are introduced in formulae with the type role, based on $tType  the type of all types. Full details of the THF and TFF type systems are provided in [SS+12,BP13,SB10,KSR16], with the last providing an overview of the first three.
The defined predicates recognized so far are
System predicates and functors are used for interpreted predicates and functors that are available in particular ATP tools. System predicates and functors start with $$. The names are not controlled by the TPTP language, so they must be used with caution.
The connectives used to build nonatomic formulae are written using intuitive notations. The universal quantifier is !, the existential quantifier is ?, and the lambda binder is ^. Quantified formulae are written in the form Quantifier [Variables] : Formula. In the THF, TFF, and FOF languages, every variable in a Formula must be bound by a preceding quantification with adequate scope. Typed Variables are given their type by a :type suffix. The binary connectives are infix  for disjunction, infix & for conjunction, infix <=> for equivalence, infix => for implication, infix <= for reverse implication, infix <~> for nonequivalence (XOR), infix ~ for negated disjunction (NOR), infix ~& for negated conjunction (NAND), infix @ for application. The only unary connective is prefix ~ for negation. Negation has higher precedence than quantification, which in turn has higher precedence than the binary connectives. No precedence is specified between the binary connectives; brackets are used to ensure the correct association. The binary connectives are left associative.
The THF and TFF languages have conditional and let expressions.
The useful_info field of an annotated formula is optional, and if it is not used then the source field becomes optional. The source field is used to record where the annotated formula came from, and is most commonly a file record or an inference record. A file record stores the name of the file from which the annotated formula was read, and optionally the name of the annotated formula as it occurs in that file  this might be different from the name of the annotated formula itself, e.g., if an ATP systems reads an annotated formula, renames it, and then prints it out. An inference record stores information about an inferred formula. The useful_info field of an annotated formula is a list of arbitrary useful information formatted as Prolog terms, as required for user applications.
An example of a THF formula section, extracted from the problem file LCL633^1.p, is shown below. An example of a TFF formula section, extracted from the problem file DAT013=1.p, is shown below that. Example THF formulae. An example of a FOF formula section, extracted from the problem file GRP194+1.p, is shown below that. An example of a clause section, extracted from the problem file GRP0397.p, is shown below that.
% %Signature thf(a,type,( a: $tType )). thf(p,type,( p: ( a > $i > $o ) > $i > $o )). thf(g,type,( g: a > $i > $o )). thf(e,type,( e: ( a > $i > $o ) > a > $i > $o )). thf(r,type,( r: $i > $i > $o )). %Axioms thf(positiveness,axiom,( ! [X: a > $i > $o] : ( mvalid @ ( mimpl @ ( mnot @ ( p @ X ) ) @ ( p @ ^ [Z: a] : ( mnot @ ( X @ Z ) ) ) ) ) )). thf(g,definition, ( g = ( ^ [Z: a,W: $i] : ! [X: a > $i > $o] : ( mimpl @ ( p @ X ) @ ( X @ Z ) @ W ) ) )). thf(e,definition, ( e = ( ^ [X: a > $i > $o,Z: a,P: $i] : ! [Y: a > $i > $o] : ( mimpl @ ( Y @ Z ) @ ( mbox @ r @ ^ [Q: $i] : ! [W: a] : ( mimpl @ ( X @ W ) @ ( Y @ W ) @ Q ) ) @ P ) ) )). %Conjecture thf(thm,conjecture, ( mvalid @ ^ [W: $i] : ! [Z: a] : ( mimpl @ ( g @ Z ) @ ( e @ g @ Z ) @ W ) )). %
% tff(list_type,type,( list: $tType )). tff(nil_type,type,( nil: list )). tff(mycons_type,type,( mycons: ( $int * list ) > list )). tff(sorted_type,type,( fib_sorted: list > $o )). tff(empty_fib_sorted,axiom,( fib_sorted(nil) )). tff(single_is_fib_sorted,axiom,( ! [X: $int] : fib_sorted(mycons(X,nil)) )). tff(double_is_fib_sorted_if_ordered,axiom,( ! [X: $int,Y: $int] : ( $less(X,Y) => fib_sorted(mycons(X,mycons(Y,nil))) ) )). tff(recursive_fib_sort,axiom,( ! [X: $int,Y: $int,Z: $int,R: list] : ( ( $less(X,Y) & $greatereq(Z,$sum(X,Y)) & fib_sorted(mycons(Y,mycons(Z,R))) ) => fib_sorted(mycons(X,mycons(Y,mycons(Z,R)))) ) )). tff(check_list,conjecture,( fib_sorted(mycons(1,mycons(2,mycons(4,mycons(7,mycons(100,nil)))))) )). %
% %Definition of a homomorphism fof(homomorphism1,axiom, ( ! [X] : ( group_member(X,f) => group_member(phi(X),h) ) )). fof(homomorphism2,axiom, ( ! [X,Y] : ( ( group_member(X,f) & group_member(Y,f) ) => multiply(h,phi(X),phi(Y)) = phi(multiply(f,X,Y)) ) )). fof(surjective,axiom, ( ! [X] : ( group_member(X,h) => ? [Y] : ( group_member(Y,f) & phi(Y) = X ) ) )). %Definition of left zero fof(left_zero,axiom, ( ! [G,X] : ( left_zero(G,X) <=> ( group_member(X,G) & ! [Y] : ( group_member(Y,G) => multiply(G,X,Y) = X ) ) ) )). %The conjecture fof(left_zero_for_f,hypothesis, ( left_zero(f,f_left_zero) )). fof(prove_left_zero_h,conjecture, ( left_zero(h,phi(f_left_zero)) )). %
% %Redundant two axioms cnf(right_identity,axiom, ( multiply(X,identity) = X )). cnf(right_inverse,axiom, ( multiply(X,inverse(X)) = identity )). ... some clauses omitted here for brevity cnf(property_of_O2,axiom, ( subgroup_member(X)  subgroup_member(Y)  multiply(X,element_in_O2(X,Y)) = Y )). %Denial of theorem cnf(b_in_O2,negated_conjecture, ( subgroup_member(b) )). cnf(b_times_a_inverse_is_c,negated_conjecture, ( multiply(b,inverse(a)) = c )). cnf(a_times_c_is_d,negated_conjecture, ( multiply(a,c) = d )). cnf(prove_d_in_O2,negated_conjecture, ( ~ subgroup_member(d) )). %
The following interpreted predicates and interpreted functions are defined. Each symbol is adhoc polymorphic over the numeric types (with one exception  $quotient is not defined for $int). All arguments must have the same numeric type. All the functions, except for the coercion functions $to_int and $to_rat, have the same range type as their arguments. For example, $sum can be used with the type signatures ($int * $int) > $int, ($rat * $rat) > $rat, and ($real * $real) > $real. The coercion function $to_int always has a $int result, and the coercion function $to_rat always has a $rat result. All the predicates have a $o result. For example, $less can be used with the type signatures ($int * $int) > $o, ($rat * $rat) > $o, and ($real * $real) > $o.
Symbol  Operation  Comments, examples  

$int  The type of integers  123, 123<integer> :: (<signed_integer><unsigned_integer>) <signed_integer> :: <sign><unsigned_integer> <unsigned_integer> :: <decimal> <decimal> :: (<zero_numeric><positive_decimal>) <positive_decimal> :: <non_zero_numeric><numeric>* <sign> ::: [+] <zero_numeric> ::: [0] <non_zero_numeric> ::: [19] <numeric> ::: [09] 
$rat  The type of rationals  123/456, 123/456, +123/456
<rational> :: (<signed_rational><unsigned_rational>) <signed_rational> :: <sign><unsigned_rational> <unsigned_rational> :: <decimal><slash><positive_decimal> <slash> ::: [/] 
$real  The type of reals  123.456, 123.456, 123.456E789, 123.456e789, 123.456E789, 123.456E789, 123.456E789 <real> :: (<signed_real><unsigned_real>) <signed_real> :: <sign><unsigned_real> <unsigned_real> :: (<decimal_fraction><decimal_exponent>) <decimal_exponent> :: (<decimal><decimal_fraction>)<exponent><decimal> <decimal_fraction> :: <decimal><dot_decimal> <dot_decimal> :: <dot><numeric><numeric>* <dot> ::: [.] <exponent> ::: [Ee] 
= (infix)  Comparison of two numbers.  The numbers must be the same atomic type (see the type system). 
$less/2  Lessthan comparison of two numbers.  $less, $lesseq, $greater,
and $greatereq are related by ! [X,Y] : ( $lesseq(X,Y) <=> ( $less(X,Y)  X = Y ) ) ! [X,Y] : ( $greater(X,Y) <=> $less(Y,X) ) ! [X,Y] : ( $greatereq(X,Y) <=> $lesseq(Y,X) ) i.e, only $less and equality need to be implemented to get all four relational operators. 
$lesseq/2  Lessthanorequalto comparison of two numbers.  
$greater/2  Greaterthan comparison of two numbers.  
$greatereq/2  Greaterthanorequalto comparison of two numbers.  
$uminus/1  Unary minus of a number.  $uminus, $sum, and $difference are
related by ! [X,Y] : $difference(X,Y) = $sum(X,$uminus(Y)) i.e, only $uminus and $sum need to be implemented to get all three additive operators. 
$sum/2  Sum of two numbers.  
$difference/2  Difference between two numbers.  
$product/2  Product of two numbers.  
$quotient/2  Exact quotient of two $rat or $real numbers.  For nonzero divisors, the result can be computed.
For zero divisors the result is not specified.
In practice, if an ATP system does not "know" that the divisor
is nonzero, it should simply not evaluate the $quotient.
Users should always guard their use of $quotient using
inequality, e.g., ! [X: $real] : ( X != 0.0 => p($quotient(5.0,X)) ) 
$quotient_e/2, $quotient_t/2, $quotient_f/2  Integral quotient of two numbers.  The three variants use different rounding to an integral result:

$remainder_e/2, $remainder_t/2, $remainder_f/2  Remainder after integral division of two numbers.  For τ ∈ {$int,$rat,
$real}, ρ ∈ {e,
t,f}, $quotient_ρ and
$remainder_ρ are related by ! [N:τ,D:τ] : $sum($product($quotient_ρ(N,D),D),$remainder_ρ(N,D)) = N For zero divisors the result is not specified. 
$floor/1  Floor of a number.  The largest integral value (in the type of the argument) not greater than the argument. 
$ceiling/1  Ceiling of a number.  The smallest integral value (in the type of the argument) not less than the argument. 
$truncate/1  Truncation of a number.  The nearest integral value (in the type of the argument) with magnitude not greater than the absolute value of the argument. 
$round/1  Rounding of a number.  The nearest integral value (in the type of the argument) to the argument. If the argument is halfway between two integral values, the nearest even integral value to the argument. 
$is_int/1  Test for coincidence with an $int value.  
$is_rat/1  Test for coincidence with a $rat value.  
$to_int/1  Coercion of a number to $int.  The largest $int not greater than the argument. If applied to an argument of type $int this is the identity function. 
$to_rat/1  Coercion of a number to $rat.  This function is not fully specified.
If applied to a $int the result is the argument over
1.
If applied to a $rat this is the identity function.
If applied to a $real that is (known to be) rational the
result is the $rat value.
For other reals the result is not specified.
In practice, if an ATP system does not "know" that the argument
is rational, it should simply not evaluate the $to_rat.
Users should always guard their use of $to_rat using
$is_rat, e.g., ! [X: $real] : ( $is_rat(X) => p($to_rat(X)) ) 
$to_real/1  Coercion of a number to $real. 
The extent to which ATP systems are able to work with the arithmetic predicates and functions can vary, from a simple ability to evaluate ground terms, e.g., $sum(2,3) can be evaluated to 5, through an ability to instantiate variables in equations involving such functions, e.g., $product(2,$uminus(X)) = $uminus($sum(X,2)) can instantiate X to 2, to extensive algebraic manipulation capability. The syntax does not axiomatize arithmetic theory, but may be used to write axioms of the theory.
In NXF the nonclassical connectives are applied in a mixed higherorderapplied/firstorderfunctional style, with the connectives applied using @ to a ()ed list of arguments. In NHF the nonclassical connectives are applied using @ in usual higherorder style with curried function applications. There are also short form unary connectives for unparameterised {$box} and {$dia}, applied directly like negation: [.] and <.>, e.g., {$box} @ (p) can be written [.] p. Short forms and long forms can be used together, e.g., itâ€™s OK to use {$necessary} and [.] in the same problem or formula.
Full specification of the connectives and their use in formulae is in the BNF starting at <nxf_atom> and <thf_defined_atomic>.
Semantics Specification
An annotated formula with the role logic is used to specify the semantics of formulae.
The semantic specification typically comes first in a file.
A semantic specification consists of the defined name of the logic followed by
== and a list of properties value assignments.
Each specification is the property name, followed by == and either a value or a tuple
of specification details.
If the first element of a list of details is a value, that is the default value for all cases
that are not specified in the rest of the list.
Each detail after the optional default value is the name of a relevant part of the vocabulary of
the problem, followed by == and a value for that named part.
The BNF grammar is here.
The grammar is not very restrictive on purpose, to enable working with other logics as well.
It is possible to create a lot of nonsense specifications, and to say the same thing in different
meaningful ways.
A tool to check the sanity of a specification is available.
A semantic specification changes the meaning of things such as the boolean type $o, universal quantification with !, etc  their existing meaning in classical logic should not be confused with the meaning in the declared logic.
For plain $modal and all the *_modal logics the properties that may be specified are $domains, $designation, $terms, and $modalities.
For $temporal_instant the properties are the $domains, $designation, and $terms of the modal logic, $modalities with different possible values, and another property $time.
The formulae of a problem can be either local (true in the current world) or global (true in all worlds). By default, formulae with the roles hypothesis and conjecture are local, and all others are global. These defaults can be overridden by adding a subrole, e.g., axiom$local, conjecture$global.