summaryrefslogtreecommitdiff
path: root/src/parser/tptp/tptp.h
blob: 4185de99178ca0b118c235d7cce34a2b32c3bf20 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
/*********************                                                        */
/*! \file tptp.h
 ** \verbatim
 ** Original author: François Bobot <francois@bobot.eu>
 ** Major contributors: none
 ** Minor contributors (to current version): Andrew Reynolds <andrew.j.reynolds@gmail.com>, Morgan Deters <mdeters@cs.nyu.edu>
 ** This file is part of the CVC4 project.
 ** Copyright (c) 2009-2013  New York University and The University of Iowa
 ** See the file COPYING in the top-level source directory for licensing
 ** information.\endverbatim
 **
 ** \brief Definitions of TPTP constants.
 **
 ** Definitions of TPTP constants.
 **/

#include "cvc4parser_private.h"

#ifndef __CVC4__PARSER__TPTP_H
#define __CVC4__PARSER__TPTP_H

#include "parser/parser.h"
#include "expr/command.h"
#include <ext/hash_set>
#include <cassert>

namespace CVC4 {

class SExpr;

namespace parser {

class Tptp : public Parser {
  friend class ParserBuilder;

  // In CNF variable are implicitly binded
  // d_freevar collect them
  std::vector< Expr > d_freeVar;
  Expr d_rtu_op;
  Expr d_stu_op;
  Expr d_utr_op;
  Expr d_uts_op;
  // The set of expression that already have a bridge
  std::hash_set<Expr, ExprHashFunction> d_r_converted;
  std::hash_set<Expr, ExprHashFunction> d_s_converted;

  //TPTP directory where to find includes
  // empty if none could be determined
  std::string d_tptpDir;

public:
  bool cnf; //in a cnf formula

  void addFreeVar(Expr var){assert(cnf); d_freeVar.push_back(var); };
  std::vector< Expr > getFreeVar(){
    assert(cnf);
    std::vector< Expr > r;
    r.swap(d_freeVar);
    return r;
  }

  inline Expr convertRatToUnsorted(Expr expr){
    ExprManager * em = getExprManager();

    // Create the conversion function If they doesn't exists
    if(d_rtu_op.isNull()){
      Type t;
      //Conversion from rational to unsorted
      t = em->mkFunctionType(em->realType(), d_unsorted);
      d_rtu_op = em->mkVar("$$rtu",t);
      preemptCommand(new DeclareFunctionCommand("$$rtu", d_rtu_op, t));
      //Conversion from unsorted to rational
      t = em->mkFunctionType(d_unsorted, em->realType());
      d_utr_op = em->mkVar("$$utr",t);
      preemptCommand(new DeclareFunctionCommand("$$utur", d_utr_op, t));
    }
    // Add the inverse in order to show that over the elements that
    // appear in the problem there is a bijection between unsorted and
    // rational
    Expr ret = em->mkExpr(kind::APPLY_UF,d_rtu_op,expr);
    if ( d_r_converted.find(expr) == d_r_converted.end() ){
      d_r_converted.insert(expr);
      Expr eq = em->mkExpr(kind::EQUAL,expr,
                           em->mkExpr(kind::APPLY_UF,d_utr_op,ret));
      preemptCommand(new AssertCommand(eq));
    };
    return ret;
  }

  inline Expr convertStrToUnsorted(Expr expr){
    ExprManager * em = getExprManager();

    // Create the conversion function If they doesn't exists
    if(d_stu_op.isNull()){
      Type t;
      //Conversion from string to unsorted
      t = em->mkFunctionType(em->stringType(), d_unsorted);
      d_stu_op = em->mkVar("$$stu",t);
      preemptCommand(new DeclareFunctionCommand("$$stu", d_stu_op, t));
      //Conversion from unsorted to string
      t = em->mkFunctionType(d_unsorted, em->stringType());
      d_uts_op = em->mkVar("$$uts",t);
      preemptCommand(new DeclareFunctionCommand("$$uts", d_uts_op, t));
    }
    // Add the inverse in order to show that over the elements that
    // appear in the problem there is a bijection between unsorted and
    // rational
    Expr ret = em->mkExpr(kind::APPLY_UF,d_stu_op,expr);
    if ( d_s_converted.find(expr) == d_s_converted.end() ){
      d_s_converted.insert(expr);
      Expr eq = em->mkExpr(kind::EQUAL,expr,
                           em->mkExpr(kind::APPLY_UF,d_uts_op,ret));
      preemptCommand(new AssertCommand(eq));
    };
    return ret;
  }

public:

  //TPTP (CNF and FOF) is unsorted so we define this common type
  Type d_unsorted;

  enum Theory {
    THEORY_CORE,
  };

  enum FormulaRole {
    FR_AXIOM,
    FR_HYPOTHESIS,
    FR_DEFINITION,
    FR_ASSUMPTION,
    FR_LEMMA,
    FR_THEOREM,
    FR_CONJECTURE,
    FR_NEGATED_CONJECTURE,
    FR_UNKNOWN,
    FR_PLAIN,
    FR_FI_DOMAIN,
    FR_FI_FUNCTORS,
    FR_FI_PREDICATES,
    FR_TYPE,
  };


protected:
  Tptp(ExprManager* exprManager, Input* input, bool strictMode = false, bool parseOnly = false);

public:
  /**
   * Add theory symbols to the parser state.
   *
   * @param theory the theory to open (e.g., Core, Ints)
   */
  void addTheory(Theory theory);

  inline void makeApplication(Expr & expr, std::string & name,
                              std::vector<Expr> & args, bool term);

  inline Command* makeCommand(FormulaRole fr, Expr & expr);

  /** Ugly hack because I don't know how to return an expression from a
      token */
  Expr d_tmp_expr;

  /** Push a new stream in the lexer. When EOF is reached the previous stream
      is reused */
  void includeFile(std::string fileName);

private:

  void addArithmeticOperators();
};/* class Tptp */

inline void Tptp::makeApplication(Expr & expr, std::string & name,
                           std::vector<Expr> & args, bool term){
  // We distinguish the symbols according to their arities
  std::stringstream ss;
  ss << name << "_" << args.size();
  name = ss.str();
  if(args.empty()){ // Its a constant
    if(isDeclared(name)){ //already appeared
      expr = getVariable(name);
    } else {
      Type t = term ? d_unsorted : getExprManager()->booleanType();
      expr = mkVar(name,t,true); //levelZero
      preemptCommand(new DeclareFunctionCommand(name, expr, t));
    }
  } else { // Its an application
    if(isDeclared(name)){ //already appeared
      expr = getVariable(name);
    } else {
      std::vector<Type> sorts(args.size(), d_unsorted);
      Type t = term ? d_unsorted : getExprManager()->booleanType();
      t = getExprManager()->mkFunctionType(sorts, t);
      expr = mkVar(name,t,true); //levelZero
      preemptCommand(new DeclareFunctionCommand(name, expr, t));
    }
    expr = getExprManager()->mkExpr(kind::APPLY_UF, expr, args);
  }
};

inline Command* Tptp::makeCommand(FormulaRole fr, Expr & expr){
  switch(fr){
  case FR_AXIOM:
  case FR_HYPOTHESIS:
  case FR_DEFINITION:
  case FR_ASSUMPTION:
  case FR_LEMMA:
  case FR_THEOREM:
  case FR_NEGATED_CONJECTURE:
  case FR_PLAIN:
    // it's a usual assert
    return new AssertCommand(expr);
  case FR_CONJECTURE:
    // something to prove
    return new AssertCommand(getExprManager()->mkExpr(kind::NOT,expr));
  case FR_UNKNOWN:
  case FR_FI_DOMAIN:
  case FR_FI_FUNCTORS:
  case FR_FI_PREDICATES:
  case FR_TYPE:
    return new EmptyCommand("Untreated role");
  }
  assert(false);// unreachable
  return NULL;
}

namespace tptp {
/**
 * Just exists to provide the uintptr_t constructor that ANTLR
 * requires.
 */
struct myExpr : public CVC4::Expr {
  myExpr() : CVC4::Expr() {}
  myExpr(void*) : CVC4::Expr() {}
  myExpr(const Expr& e) : CVC4::Expr(e) {}
  myExpr(const myExpr& e) : CVC4::Expr(e) {}
};/* struct myExpr */

enum NonAssoc {
  NA_IFF,
  NA_IMPLIES,
  NA_REVIMPLIES,
  NA_REVIFF,
  NA_REVOR,
  NA_REVAND,
};

}/* CVC4::parser::tptp namespace */


}/* CVC4::parser namespace */
}/* CVC4 namespace */

#endif /* __CVC4__PARSER__TPTP_INPUT_H */
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback