Skip to content

Commit c81e4bc

Browse files
authored
Use PROGRAM_TYPE for programs and oracles (#127)
1 parent f170cc8 commit c81e4bc

7 files changed

Lines changed: 28 additions & 8 deletions

File tree

src/cmd_parser.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,6 @@ bool CmdParser::parseNextCommand()
144144
std::vector<Expr> params;
145145
// attributes marked on variables
146146
std::map<ExprValue*, AttrMap> pattrMap;
147-
bool flattenFunction = (tok != Token::DECLARE_ORACLE_FUN);
148147
if (tok == Token::DECLARE_FUN || tok == Token::DECLARE_ORACLE_FUN)
149148
{
150149
sorts = d_eparser.parseTypeList();
@@ -180,7 +179,9 @@ bool CmdParser::parseNextCommand()
180179
t = ret;
181180
if (!sorts.empty())
182181
{
183-
t = d_state.mkFunctionType(sorts, ret, flattenFunction);
182+
t = (tok == Token::DECLARE_ORACLE_FUN)
183+
? d_state.mkProgramType(sorts, ret)
184+
: d_state.mkFunctionType(sorts, ret);
184185
}
185186
std::vector<Expr> opaqueArgs;
186187
while (t.getKind()==Kind::FUNCTION_TYPE && t[0].getKind()==Kind::OPAQUE_TYPE)
@@ -733,7 +734,7 @@ bool CmdParser::parseNextCommand()
733734
Expr progType = retType;
734735
if (!argTypes.empty())
735736
{
736-
progType = d_state.mkFunctionType(argTypes, retType, false);
737+
progType = d_state.mkProgramType(argTypes, retType);
737738
}
738739
// it may have been forward declared
739740
Expr pprev = d_state.getVar(name);

src/expr_parser.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -597,7 +597,7 @@ Expr ExprParser::parseExpr()
597597
Trace("parser") << "Binder is " << vl << std::endl;
598598
Trace("parser") << "Env is " << env << std::endl;
599599
// make the program variable, whose type is abstract
600-
Expr ftype = d_state.mkFunctionType(fargTypes, atype, false);
600+
Expr ftype = d_state.mkProgramType(fargTypes, atype);
601601
std::stringstream pvname;
602602
pvname << "eo::match_" << hd;
603603
Expr pv = d_state.mkSymbol(Kind::PROGRAM_CONST, pvname.str(), ftype);

src/kind.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ std::ostream& operator<<(std::ostream& o, Kind k)
1919
case Kind::NONE: o << "NONE"; break;
2020
case Kind::TYPE: o << "TYPE"; break;
2121
case Kind::FUNCTION_TYPE: o << "FUNCTION_TYPE"; break;
22+
case Kind::PROGRAM_TYPE: o << "PROGRAM_TYPE"; break;
2223
case Kind::PROOF_TYPE: o << "PROOF_TYPE"; break;
2324
case Kind::ABSTRACT_TYPE: o << "ABSTRACT_TYPE"; break;
2425
case Kind::BOOL_TYPE: o << "BOOL_TYPE"; break;
@@ -110,6 +111,7 @@ std::string kindToTerm(Kind k)
110111
{
111112
case Kind::TYPE: ss << "Type"; break;
112113
case Kind::FUNCTION_TYPE: ss << "->"; break;
114+
case Kind::PROGRAM_TYPE: ss << "eo::arrow"; break;
113115
case Kind::PROOF_TYPE: ss << "Proof"; break;
114116
case Kind::ABSTRACT_TYPE: ss << "?"; break;
115117
case Kind::BOOL_TYPE: ss << "Bool"; break;

src/kind.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,13 @@ enum class Kind
2323
// types
2424
TYPE,
2525
FUNCTION_TYPE,
26+
PROGRAM_TYPE,
2627
PROOF_TYPE,
2728
ABSTRACT_TYPE,
2829
BOOL_TYPE,
2930
QUOTE_TYPE,
3031
OPAQUE_TYPE, // an argument marked :opaque, temporary during parsing
31-
NULL_TYPE, // an argument marked :implicit, temporary during parsing
32+
NULL_TYPE, // an argument marked :implicit, temporary during parsing
3233

3334
// terms
3435
APPLY,
@@ -43,7 +44,8 @@ enum class Kind
4344
// symbols
4445
PARAM,
4546
CONST,
46-
BUILTIN_CONST, // used for e.g. _, ->, eo::*, as, etc. which are temporary during parsing only
47+
BUILTIN_CONST, // used for e.g. _, ->, eo::*, as, etc. which are temporary
48+
// during parsing only
4749
PROGRAM_CONST,
4850
PROOF_RULE,
4951
VARIABLE,

src/state.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -556,6 +556,18 @@ Expr State::mkFunctionType(const std::vector<Expr>& args, const Expr& ret, bool
556556
return curr;
557557
}
558558

559+
Expr State::mkProgramType(const std::vector<Expr>& args, const Expr& ret)
560+
{
561+
Assert(!args.empty());
562+
std::vector<ExprValue*> atypes;
563+
for (size_t i = 0, nargs = args.size(); i < nargs; i++)
564+
{
565+
atypes.push_back(args[i].getValue());
566+
}
567+
atypes.push_back(ret.getValue());
568+
return Expr(mkExprInternal(Kind::PROGRAM_TYPE, atypes));
569+
}
570+
559571
Expr State::mkRequires(const std::vector<Expr>& args, const Expr& ret)
560572
{
561573
Expr curr = ret;

src/state.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,8 @@ class State
9898
Expr mkTypeConstant(const std::string& name, size_t arity);
9999
/** (-> <type>+ <type>) */
100100
Expr mkFunctionType(const std::vector<Expr>& args, const Expr& ret, bool flatten = true);
101+
/** (-> <type>+ <type>) */
102+
Expr mkProgramType(const std::vector<Expr>& args, const Expr& ret);
101103
/** ? */
102104
Expr mkAbstractType();
103105
/** Bool */

src/type_checker.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ Expr TypeChecker::getTypeInternal(ExprValue* e, std::ostream* out)
241241
case Kind::ABSTRACT_TYPE:
242242
case Kind::BOOL_TYPE:
243243
case Kind::FUNCTION_TYPE:
244-
return d_state.mkType();
244+
case Kind::PROGRAM_TYPE: return d_state.mkType();
245245
case Kind::PROOF_TYPE:
246246
{
247247
ExprValue* ctype = d_state.lookupType(e->d_children[0]);
@@ -343,7 +343,8 @@ Expr TypeChecker::getTypeAppInternal(std::vector<ExprValue*>& children,
343343
ExprValue* hd = children[0];
344344
ExprValue* hdType = d_state.lookupType(hd);
345345
Assert(hdType != nullptr) << "No type for " << Expr(hd);
346-
if (hdType->getKind()!=Kind::FUNCTION_TYPE)
346+
Kind hk = hdType->getKind();
347+
if (hk != Kind::FUNCTION_TYPE && hk != Kind::PROGRAM_TYPE)
347348
{
348349
// non-function at head
349350
if (out)

0 commit comments

Comments
 (0)