#ifndef __VAMPIRE_C_API__
#define __VAMPIRE_C_API__
#ifdef __cplusplus
extern "C" {
#endif
#include <stddef.h>
#include <stdbool.h>
#include <stdint.h>
typedef struct vampire_term_t vampire_term_t;
typedef struct vampire_literal_t vampire_literal_t;
typedef struct vampire_formula_t vampire_formula_t;
typedef struct vampire_unit_t vampire_unit_t;
typedef struct vampire_clause_t vampire_clause_t;
typedef struct vampire_problem_t vampire_problem_t;
typedef enum {
VAMPIRE_PROOF = 0,
VAMPIRE_SATISFIABLE = 1,
VAMPIRE_TIMEOUT = 2,
VAMPIRE_MEMORY_LIMIT = 3,
VAMPIRE_UNKNOWN = 4,
VAMPIRE_INCOMPLETE = 5
} vampire_proof_result_t;
typedef enum {
VAMPIRE_AXIOM = 0,
VAMPIRE_NEGATED_CONJECTURE = 1,
VAMPIRE_CONJECTURE = 2
} vampire_input_type_t;
typedef enum {
INPUT,
GENERIC_FORMULA_CLAUSE_TRANSFORMATION,
NEGATED_CONJECTURE,
ANSWER_LITERAL_INJECTION,
ANSWER_LITERAL_INPUT_SKOLEMISATION,
CLAIM_DEFINITION,
RECTIFY,
CLOSURE,
FLATTEN,
ENNF,
NNF,
REDUCE_FALSE_TRUE,
DEFINITION_FOLDING,
THEORY_NORMALIZATION,
ALASCA_INTEGER_TRANSFORMATION,
SKOLEMIZE,
SKOLEM_SYMBOL_INTRODUCTION,
CLAUSIFY,
REORIENT_EQUATIONS,
GENERIC_FORMULA_CLAUSE_TRANSFORMATION_LAST,
GENERIC_SIMPLIFYING_INFERENCE,
REORDER_LITERALS,
REMOVE_DUPLICATE_LITERALS,
TRIVIAL_INEQUALITY_REMOVAL,
EQUALITY_RESOLUTION_WITH_DELETION,
FORWARD_SUBSUMPTION_RESOLUTION,
BACKWARD_SUBSUMPTION_RESOLUTION,
FORWARD_DEMODULATION,
BACKWARD_DEMODULATION,
ALASCA_FWD_DEMODULATION,
ALASCA_BWD_DEMODULATION,
FORWARD_SUBSUMPTION_DEMODULATION,
BACKWARD_SUBSUMPTION_DEMODULATION,
FORWARD_LITERAL_REWRITING,
INNER_REWRITING,
CONDENSATION,
EVALUATION,
ALASCA_NORMALIZATION,
ALASCA_ABSTRACTION,
ALASCA_FLOOR_ELIMINATION,
CANCELLATION,
INTERPRETED_SIMPLIFICATION,
THEORY_FLATTENING,
TERM_ALGEBRA_DISTINCTNESS,
TERM_ALGEBRA_POSITIVE_INJECTIVITY_SIMPLIFYING,
TERM_ALGEBRA_NEGATIVE_INJECTIVITY_SIMPLIFYING,
GLOBAL_SUBSUMPTION,
DISTINCT_EQUALITY_REMOVAL,
GAUSSIAN_VARIABLE_ELIMINIATION,
ARITHMETIC_SUBTERM_GENERALIZATION,
ANSWER_LITERAL_REMOVAL,
ANSWER_LITERAL_JOIN_WITH_CONSTRAINTS,
ANSWER_LITERAL_JOIN_AS_ITE,
AVATAR_ASSERTION_REINTRODUCTION,
CASES_SIMP,
ALASCA_VIRAS_QE,
BOOL_SIMP,
FUNCTION_DEFINITION_DEMODULATION,
GENERIC_SIMPLIFYING_INFERENCE_LAST,
GENERIC_GENERATING_INFERENCE,
RESOLUTION,
CONSTRAINED_RESOLUTION,
FACTORING,
CONSTRAINED_FACTORING,
SUPERPOSITION,
FUNCTION_DEFINITION_REWRITING,
CONSTRAINED_SUPERPOSITION,
EQUALITY_FACTORING,
EQUALITY_RESOLUTION,
EXTENSIONALITY_RESOLUTION,
TERM_ALGEBRA_INJECTIVITY_GENERATING,
TERM_ALGEBRA_ACYCLICITY,
FOOL_PARAMODULATION,
UNIT_RESULTING_RESOLUTION,
INDUCTION_HYPERRESOLUTION,
INSTANTIATION,
ALASCA_FOURIER_MOTZKIN,
ALASCA_INTEGER_FOURIER_MOTZKIN,
ALASCA_TERM_FACTORING,
ALASCA_FLOOR_BOUNDS,
ALASCA_EQ_FACTORING,
ALASCA_LITERAL_FACTORING,
ALASCA_SUPERPOSITION,
ALASCA_COHERENCE,
ALASCA_COHERENCE_NORMALIZATION,
ALASCA_VARIABLE_ELIMINATION,
ARG_CONG,
INJECTIVITY,
PRIMITIVE_INSTANTIATION,
LEIBNIZ_ELIMINATION,
HILBERTS_CHOICE_INSTANCE,
NEGATIVE_EXT,
EQ_TO_DISEQ,
HOL_NOT_ELIMINATION,
BINARY_CONN_ELIMINATION,
VSIGMA_ELIMINATION,
VPI_ELIMINATION,
HOL_EQUALITY_ELIMINATION,
GENERIC_GENERATING_INFERENCE_LAST,
EQUALITY_PROXY_REPLACEMENT,
EQUALITY_PROXY_AXIOM1,
EQUALITY_PROXY_AXIOM2,
DEFINITION_UNFOLDING,
FUNCTION_DEFINITION,
PREDICATE_DEFINITION,
PREDICATE_DEFINITION_UNFOLDING,
PREDICATE_DEFINITION_MERGING,
POLARITY_FLIPPING,
UNUSED_PREDICATE_DEFINITION_REMOVAL,
PURE_PREDICATE_REMOVAL,
INEQUALITY_SPLITTING,
INEQUALITY_SPLITTING_NAME_INTRODUCTION,
DISTINCTNESS_AXIOM,
BOOLEAN_TERM_ENCODING,
FOOL_ELIMINATION,
FOOL_ITE_DEFINITION,
FOOL_LET_DEFINITION,
FOOL_FORMULA_DEFINITION,
FOOL_MATCH_DEFINITION,
GENERAL_SPLITTING,
GENERAL_SPLITTING_COMPONENT,
COLOR_UNBLOCKING,
SAT_COLOR_ELIMINATION,
FORMULIFY,
FMB_FLATTENING,
FMB_FUNC_DEF,
FMB_DEF_INTRO,
MODEL_NOT_FOUND,
ADD_SORT_PREDICATES,
ADD_SORT_FUNCTIONS,
ANSWER_LITERAL_RESOLVER,
THEORY_TAUTOLOGY_SAT_CONFLICT,
GENERIC_AVATAR_INFERENCE,
AVATAR_DEFINITION,
AVATAR_COMPONENT,
AVATAR_REFUTATION,
AVATAR_REFUTATION_SMT,
AVATAR_SPLIT_CLAUSE,
AVATAR_CONTRADICTION_CLAUSE,
GENERIC_AVATAR_INFERENCE_LAST,
GENERIC_THEORY_AXIOM,
THA_COMMUTATIVITY,
THA_ASSOCIATIVITY,
THA_RIGHT_IDENTITY,
THA_LEFT_IDENTITY,
THA_INVERSE_OP_OP_INVERSES,
THA_INVERSE_OP_UNIT,
THA_INVERSE_ASSOC,
THA_NONREFLEX,
THA_TRANSITIVITY,
THA_ORDER_TOTALITY,
THA_ORDER_MONOTONICITY,
THA_ALASCA,
THA_PLUS_ONE_GREATER,
THA_ORDER_PLUS_ONE_DICHOTOMY,
THA_MINUS_MINUS_X,
THA_TIMES_ZERO,
THA_DISTRIBUTIVITY,
THA_DIVISIBILITY,
THA_MODULO_MULTIPLY,
THA_MODULO_POSITIVE,
THA_MODULO_SMALL,
THA_DIVIDES_MULTIPLY,
THA_NONDIVIDES_SKOLEM,
THA_ABS_EQUALS,
THA_ABS_MINUS_EQUALS,
THA_QUOTIENT_NON_ZERO,
THA_QUOTIENT_MULTIPLY,
THA_EXTRA_INTEGER_ORDERING,
THA_FLOOR_SMALL,
THA_FLOOR_BIG,
THA_CEILING_BIG,
THA_CEILING_SMALL,
THA_TRUNC1,
THA_TRUNC2,
THA_TRUNC3,
THA_TRUNC4,
THA_ARRAY_EXTENSIONALITY,
THA_BOOLEAN_ARRAY_EXTENSIONALITY,
THA_BOOLEAN_ARRAY_WRITE1,
THA_BOOLEAN_ARRAY_WRITE2,
THA_ARRAY_WRITE1,
THA_ARRAY_WRITE2,
TERM_ALGEBRA_ACYCLICITY_AXIOM,
TERM_ALGEBRA_DIRECT_SUBTERMS_AXIOM,
TERM_ALGEBRA_SUBTERMS_TRANSITIVE_AXIOM,
TERM_ALGEBRA_DISCRIMINATION_AXIOM,
TERM_ALGEBRA_DISTINCTNESS_AXIOM,
TERM_ALGEBRA_EXHAUSTIVENESS_AXIOM,
TERM_ALGEBRA_INJECTIVITY_AXIOM,
FOOL_AXIOM_TRUE_NEQ_FALSE,
FOOL_AXIOM_ALL_IS_TRUE_OR_FALSE,
STRUCT_INDUCTION_AXIOM_ONE,
STRUCT_INDUCTION_AXIOM_TWO,
STRUCT_INDUCTION_AXIOM_THREE,
STRUCT_INDUCTION_AXIOM_RECURSION,
INT_INF_UP_INDUCTION_AXIOM,
INT_INF_DOWN_INDUCTION_AXIOM,
INT_FIN_UP_INDUCTION_AXIOM,
INT_FIN_DOWN_INDUCTION_AXIOM,
INT_DB_UP_INDUCTION_AXIOM,
INT_DB_DOWN_INDUCTION_AXIOM,
} vampire_inference_rule_t;
typedef struct {
unsigned int id;
vampire_inference_rule_t rule;
vampire_input_type_t input_type;
unsigned int* premise_ids;
size_t premise_count;
vampire_unit_t* unit;
} vampire_proof_step_t;
void vampire_prepare_for_next_proof(void);
void vampire_reset(void);
void vampire_set_time_limit(int seconds);
void vampire_set_time_limit_deciseconds(int deciseconds);
void vampire_set_time_limit_milliseconds(int milliseconds);
void vampire_set_show_proof(bool show);
void vampire_set_saturation_algorithm(const char* algorithm);
unsigned int vampire_add_function(const char* name, unsigned int arity);
unsigned int vampire_add_predicate(const char* name, unsigned int arity);
vampire_term_t* vampire_var(unsigned int index);
vampire_term_t* vampire_constant(unsigned int functor);
vampire_term_t* vampire_term(unsigned int functor, vampire_term_t** args, size_t arg_count);
vampire_literal_t* vampire_eq(bool positive, vampire_term_t* lhs, vampire_term_t* rhs);
vampire_literal_t* vampire_lit(unsigned int pred, bool positive,
vampire_term_t** args, size_t arg_count);
vampire_literal_t* vampire_neg(vampire_literal_t* l);
vampire_formula_t* vampire_atom(vampire_literal_t* l);
vampire_formula_t* vampire_not(vampire_formula_t* f);
vampire_formula_t* vampire_and(vampire_formula_t** formulas, size_t count);
vampire_formula_t* vampire_or(vampire_formula_t** formulas, size_t count);
vampire_formula_t* vampire_imp(vampire_formula_t* lhs, vampire_formula_t* rhs);
vampire_formula_t* vampire_iff(vampire_formula_t* lhs, vampire_formula_t* rhs);
vampire_formula_t* vampire_forall(unsigned int var_index, vampire_formula_t* f);
vampire_formula_t* vampire_exists(unsigned int var_index, vampire_formula_t* f);
vampire_formula_t* vampire_true(void);
vampire_formula_t* vampire_false(void);
vampire_unit_t* vampire_axiom_formula(vampire_formula_t* f);
vampire_unit_t* vampire_conjecture_formula(vampire_formula_t* f);
vampire_clause_t* vampire_axiom_clause(vampire_literal_t** literals, size_t count);
vampire_clause_t* vampire_conjecture_clause(vampire_literal_t** literals, size_t count);
vampire_clause_t* vampire_clause(vampire_literal_t** literals, size_t count,
vampire_input_type_t input_type);
vampire_problem_t* vampire_problem_from_clauses(vampire_clause_t** clauses, size_t count);
vampire_problem_t* vampire_problem_from_units(vampire_unit_t** units, size_t count);
vampire_proof_result_t vampire_prove(vampire_problem_t* problem);
vampire_unit_t* vampire_get_refutation(void);
void vampire_print_proof(vampire_unit_t* refutation);
int vampire_print_proof_to_file(const char* filename, vampire_unit_t* refutation);
int vampire_extract_proof(vampire_unit_t* refutation,
vampire_proof_step_t** out_steps,
size_t* out_count);
void vampire_free_proof_steps(vampire_proof_step_t* steps, size_t count);
int vampire_get_literals(vampire_clause_t* clause,
vampire_literal_t*** out_literals,
size_t* out_count);
void vampire_free_literals(vampire_literal_t** literals);
vampire_clause_t* vampire_unit_as_clause(vampire_unit_t* unit);
vampire_formula_t* vampire_unit_as_formula(vampire_unit_t* unit);
bool vampire_clause_is_empty(vampire_clause_t* clause);
char* vampire_term_to_string(vampire_term_t* term);
char* vampire_literal_to_string(vampire_literal_t* literal);
char* vampire_clause_to_string(vampire_clause_t* clause);
char* vampire_formula_to_string(vampire_formula_t* formula);
void vampire_free_string(char* str);
bool vampire_term_equal(vampire_term_t* a, vampire_term_t* b);
uint64_t vampire_term_hash(vampire_term_t* a);
bool vampire_formula_equal(vampire_formula_t* a, vampire_formula_t* b);
uint64_t vampire_formula_hash(vampire_formula_t* a);
const char* vampire_rule_name(vampire_inference_rule_t rule);
const char* vampire_input_type_name(vampire_input_type_t input_type);
#ifdef __cplusplus
}
#endif
#endif