Fix rewriter for lambda (#2211)
authorAndrew Reynolds <andrew.j.reynolds@gmail.com>
Thu, 26 Jul 2018 19:48:40 +0000 (14:48 -0500)
committerAndres Noetzli <andres.noetzli@gmail.com>
Thu, 26 Jul 2018 19:48:40 +0000 (12:48 -0700)
commit8db4b7f5a0a7c3299313668e77bcf3944b8e5a01
tree5e12ccdea4e9a9285de2b04fdfbc2c1f3ef22f05
parenta131d4b4cf086f27c4c62d4b012862c75153033e
Fix rewriter for lambda (#2211)

The rewriter for lambda is currently too aggressive, there are cases like:

lambda xy. x = y

that are converted into an array representation that when indexing based on x gives (store y true false), which is subsequently converted to:

lambda fv_1 fv_2. fv_1 = y

where fv_1 and fv_2 are canonical free variables. Here, y is used as index but was not substituted hence is incorrectly made free.

To make things simpler, this PR disables any rewriting for lambda unless the array representation of the lambda is a constant, which hardcodes/simplifies a previous argument (reqConst=true). This fixes a sygus issue I ran into yesterday (regression added in this PR).

Some parts of the code were formatted as a result.
src/theory/builtin/theory_builtin_rewriter.cpp
src/theory/builtin/theory_builtin_rewriter.h
src/theory/builtin/theory_builtin_type_rules.h
test/regress/Makefile.tests
test/regress/regress1/sygus/sygus-lambda-fv.sy [new file with mode: 0644]