Skip to content

Commit 3804b18

Browse files
committed
SMT2 parser: lambda expressions
This uses the existing code for parsing bindings to parse lambda expressions.
1 parent 4a75080 commit 3804b18

File tree

4 files changed

+29
-0
lines changed

4 files changed

+29
-0
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
CORE
2+
lambda1.smt2
3+
4+
^EXIT=0$
5+
^SIGNAL=0$
6+
^unsat$
7+
--
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
(set-logic QF_BV)
2+
3+
(define-const min (-> (_ BitVec 8) (_ BitVec 8) (_ BitVec 8))
4+
(lambda ((a (_ BitVec 8)) (b (_ BitVec 8)))
5+
(ite (bvule a b) a b)))
6+
7+
(define-fun p1 () Bool (= (min #x01 #x02) #x01))
8+
(define-fun p2 () Bool (= (min #xff #xfe) #xfe))
9+
10+
; all must be true
11+
12+
(assert (not (and p1 p2)))
13+
14+
(check-sat)

src/solvers/smt2/smt2_parser.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,12 @@ std::pair<binding_exprt::variablest, exprt> smt2_parsert::binding(irep_idt id)
275275
return {std::move(bindings), std::move(expr)};
276276
}
277277

278+
exprt smt2_parsert::lambda_expression()
279+
{
280+
auto binding = this->binding(ID_lambda);
281+
return lambda_exprt(binding.first, binding.second);
282+
}
283+
278284
exprt smt2_parsert::quantifier_expression(irep_idt id)
279285
{
280286
auto binding = this->binding(id);
@@ -972,6 +978,7 @@ void smt2_parsert::setup_expressions()
972978
return from_integer(ieee_floatt::ROUND_TO_ZERO, unsignedbv_typet(32));
973979
};
974980

981+
expressions["lambda"] = [this] { return lambda_expression(); };
975982
expressions["let"] = [this] { return let_expression(); };
976983
expressions["exists"] = [this] { return quantifier_expression(ID_exists); };
977984
expressions["forall"] = [this] { return quantifier_expression(ID_forall); };

src/solvers/smt2/smt2_parser.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@ class smt2_parsert
164164
exprt unary(irep_idt, const exprt::operandst &);
165165

166166
std::pair<binding_exprt::variablest, exprt> binding(irep_idt);
167+
exprt lambda_expression();
167168
exprt let_expression();
168169
exprt quantifier_expression(irep_idt);
169170
exprt function_application(

0 commit comments

Comments
 (0)