/*****************************************************************************/
/*!
* \file kinds.h
*
* Author: Clark Barrett
*
* Created: Mon Jan 20 13:38:52 2003
*
*
*
* License to use, copy, modify, sell and/or distribute this software
* and its documentation for any purpose is hereby granted without
* royalty, subject to the terms and conditions defined in the \ref
* LICENSE file provided with this distribution.
*
*
*
*/
/*****************************************************************************/
#ifndef _cvc3__include__kinds_h_
#define _cvc3__include__kinds_h_
namespace CVC3 {
// The commonly used kinds and the kinds needed by the parser. All
// these kinds are registered by the ExprManager and are readily
// available for everyone else.
typedef enum {
NULL_KIND = 0,
// Generic LISP kinds for representing raw parsed expressions
RAW_LIST, //!< May have any number of children >= 0
//! Identifier is (ID (STRING_EXPR "name"))
ID,
// Leaf exprs
STRING_EXPR,
RATIONAL_EXPR,
TRUE_EXPR,
FALSE_EXPR,
// Types
BOOLEAN,
// TUPLE_TYPE,
ANY_TYPE,
ARROW,
// The "type" of any expression type (as in BOOLEAN : TYPE).
TYPE,
// Declaration of new (uninterpreted) types: T1, T2, ... : TYPE
// (TYPEDECL T1 T2 ...)
TYPEDECL,
// Declaration of a defined type T : TYPE = type === (TYPEDEF T type)
TYPEDEF,
// Equality
EQ,
NEQ,
DISTINCT,
// Propositional connectives
NOT,
AND,
OR,
XOR,
IFF,
IMPLIES,
// BOOL_VAR, //!< Boolean variables are treated as 0-ary predicates
// Propositional relations (for circuit propagation)
AND_R,
IFF_R,
ITE_R,
// (ITE c e1 e2) == IF c THEN e1 ELSE e2 ENDIF, the internal
// representation of the conditional. Parser produces (IF ...).
ITE,
// Quantifiers
FORALL,
EXISTS,
// Uninterpreted function
UFUNC,
// Application of a function
APPLY,
// Top-level Commands
ASSERT,
QUERY,
CHECKSAT,
CONTINUE,
RESTART,
DBG,
TRACE,
UNTRACE,
OPTION,
HELP,
TRANSFORM,
PRINT,
CALL,
ECHO,
INCLUDE,
DUMP_PROOF,
DUMP_ASSUMPTIONS,
DUMP_SIG,
DUMP_TCC,
DUMP_TCC_ASSUMPTIONS,
DUMP_TCC_PROOF,
DUMP_CLOSURE,
DUMP_CLOSURE_PROOF,
WHERE,
ASSERTIONS,
ASSUMPTIONS,
COUNTEREXAMPLE,
COUNTERMODEL,
PUSH,
POP,
POPTO,
PUSH_SCOPE,
POP_SCOPE,
POPTO_SCOPE,
CONTEXT,
FORGET,
GET_TYPE,
CHECK_TYPE,
GET_CHILD,
SUBSTITUTE,
SEQ,
// Kinds used mostly in the parser
TCC,
// Variable declaration (VARDECL v1 v2 ... v_n type). A variable
// can be an ID or a BOUNDVAR.
VARDECL,
// A list of variable declarations (VARDECLS (VARDECL ...) (VARDECL ...) ...)
VARDECLS,
// Bound variables have a "printable name", the one the user typed
// in, and a uniqueID used to distinguish it from other bound
// variables, which is effectively the alpha-renaming:
// Op(BOUND_VAR (BOUND_ID "user_name" "uniqueID")). Note that
// BOUND_VAR is an operator (Expr without children), just as UFUNC
// and UCONST.
// The uniqueID normally is just a number, so one can print a bound
// variable X as X_17.
// NOTE that in the parsed expressions like LET x: T = e IN foo(x),
// the second instance of 'x' will be an ID, and *not* a BOUNDVAR.
// The parser does not know how to resolve bound variables, and it
// has to be resolved later.
BOUND_VAR,
BOUND_ID,
// Updator "e1 WITH := e2" is represented as
// (UPDATE e1 (UPDATE_SELECT ) e2), where is the list of accessors:
// (READ idx)
// ID (what's that for?)
// (REC_SELECT ID)
// and (TUPLE_SELECT num).
// UPDATE,
// UPDATE_SELECT,
// Record type [# f1 : t1, f2 : t2 ... #] is represented as
// (RECORD_TYPE (f1 t1) (f2 t2) ... )
// RECORD_TYPE,
// // (# f1=e1, f2=e2, ...#) == (RECORD (f1 e1) ...)
// RECORD,
// RECORD_SELECT,
// RECORD_UPDATE,
// // (e1, e2, ...) == (TUPLE e1 e2 ...)
// TUPLE,
// TUPLE_SELECT,
// TUPLE_UPDATE,
// SUBRANGE,
// Enumerated type (SCALARTYPE v1 v2 ...)
// SCALARTYPE,
// Predicate subtype: the argument is the predicate (lambda-expression)
SUBTYPE,
// Datatype is Expr(DATATYPE, Constructors), where Constructors is a
// vector of Expr(CONSTRUCTOR, id [ , arg ]), where 'id' is an ID,
// and 'arg' a VARDECL node (list of variable declarations with
// types). If 'arg' is present, the constructor has arguments
// corresponding to the declared variables.
// DATATYPE,
// THISTYPE, // Used to indicate recursion in recursive datatypes
// CONSTRUCTOR,
// SELECTOR,
// TESTER,
// Expression e WITH accessor := e2 is transformed by the command
// processor into (DATATYPE_UPDATE e accessor e2), where e is the
// original datatype value C(a1, ..., an) (here C is the
// constructor), and "accessor" is the name of one of the arguments
// a_i of C.
// DATATYPE_UPDATE,
// Statement IF c1 THEN e1 ELSIF c2 THEN e2 ... ELSE e_n ENDIF is
// represented as (IF (IFTHEN c1 e1) (IFTHEN c2 e2) ... (ELSE e_n))
IF,
IFTHEN,
ELSE,
// Lisp version of multi-branch IF:
// (COND (c1 e1) (c2 e2) ... (ELSE en))
COND,
// LET x1: t1 = e1, x2: t2 = e2, ... IN e
// Parser builds:
// (LET (LETDECLS (LETDECL x1 t1 e1) (LETDECL x2 t2 e2) ... ) e)
// where each x_i is a BOUNDVAR.
// After processing, it is rebuilt to have (LETDECL var def); the
// type is set as the attribute to var.
LET,
LETDECLS,
LETDECL,
// Lambda-abstraction LAMBDA () : e === (LAMBDA e)
LAMBDA,
// Symbolic simulation operator
SIMULATE,
// Uninterpreted constants (variables) x1, x2, ... , x_n : type
// (CONST (VARLIST x1 x2 ... x_n) type)
// Uninterpreted functions are declared as constants of functional type.
// After processing, uninterpreted functions and constants
// (a.k.a. variables) are represented as Op(UFUNC, (ID "name")) and
// Op(UCONST, (ID "name")) with the appropriate type attribute.
CONST,
VARLIST,
UCONST,
// User function definition f(args) : type = e === (DEFUN args type e)
// Here 'args' are bound var declarations
DEFUN,
// Arithmetic types and operators
// REAL,
// INT,
// UMINUS,
// PLUS,
// MINUS,
// MULT,
// DIVIDE,
// INTDIV,
// MOD,
// LT,
// LE,
// GT,
// GE,
// IS_INTEGER,
// NEGINF,
// POSINF,
// DARK_SHADOW,
// GRAY_SHADOW,
// //Floor theory operators
// FLOOR,
// Kind for Extension to Non-linear Arithmetic
// POW,
// Kinds for proof terms
PF_APPLY,
PF_HOLE,
// // Mlss
// EMPTY, // {}
// UNION, // +
// INTER, // *
// DIFF,
// SINGLETON,
// IN,
// INCS,
// INCIN,
//Skolem variable
SKOLEM_VAR,
// Expr that holds a theorem
THEOREM_KIND,
//! Must always be the last kind
LAST_KIND
} Kind;
} // end of namespace CVC3
#endif