Skip to content

Commit 6bcf926

Browse files
authored
Merge pull request #135 from jad-hamza/fix-115
Implement @samarion's fix for issue 115 with lambda pointers
2 parents fdbf887 + d8d258e commit 6bcf926

File tree

2 files changed

+31
-12
lines changed

2 files changed

+31
-12
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
(define-fun f () (=> Int Int) (lambda ((loc Int)) 0))
2+
(declare-datatypes () ((S (N) (C (r Int) (e Int)))))
3+
(declare-datatypes () ((T (TT (body S)))))
4+
(define-fun t () T (TT (C 22 5)))
5+
(assert (not (let ((g f)) (= (@ (ite (is-C (body t)) (lambda ((r2 Int)) (ite (= r2 (r (body t))) (e (body t)) (@ g r2))) g) 22) 5))))
6+
(check-sat)

src/main/scala/inox/solvers/unrolling/Templates.scala

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -514,23 +514,32 @@ trait Templates
514514

515515
object Template {
516516

517-
def lambdaPointers(encoder: Expr => Encoded)(expr: Expr): Map[Encoded, Encoded] = {
518-
def collectSelectors(expr: Expr, ptr: Expr): Seq[(Expr, Variable)] = expr match {
519-
case adt @ ADT(id, tps, es) => (adt.getConstructor.fields zip es).flatMap {
520-
case (vd, e) => collectSelectors(e, ADTSelector(ptr, vd.id))
521-
}
517+
private def collectSelectors(expr: Expr, ptr: Expr): Seq[(Expr, Variable)] = expr match {
518+
case adt @ ADT(id, tps, es) => (adt.getConstructor.fields zip es).flatMap {
519+
case (vd, e) => collectSelectors(e, ADTSelector(ptr, vd.id))
520+
}
522521

523-
case Tuple(es) => es.zipWithIndex.flatMap {
524-
case (e, i) => collectSelectors(e, TupleSelect(ptr, i + 1))
525-
}
522+
case Tuple(es) => es.zipWithIndex.flatMap {
523+
case (e, i) => collectSelectors(e, TupleSelect(ptr, i + 1))
524+
}
525+
526+
case IsTyped(v: Variable, _: FunctionType) => Seq(ptr -> v)
527+
case _ => Seq.empty
528+
}
526529

527-
case IsTyped(v: Variable, _: FunctionType) => Seq(ptr -> v)
528-
case _ => Seq.empty
530+
private def resultPointers(encoder: Expr => Encoded)(expr: Expr): Map[Encoded, Encoded] = {
531+
val pointers = expr match {
532+
case Equals(v @ (_: Variable | _: FunctionInvocation | _: Application), e) => collectSelectors(e, v).toMap
533+
case Equals(e, v @ (_: Variable | _: FunctionInvocation | _: Application)) => collectSelectors(e, v).toMap
534+
case _ => Map.empty[Expr, Variable]
529535
}
530536

537+
pointers.map(p => encoder(p._1) -> encoder(p._2))
538+
}
539+
540+
def lambdaPointers(encoder: Expr => Encoded)(expr: Expr): Map[Encoded, Encoded] = {
541+
531542
val pointers = exprOps.collect {
532-
case Equals(v @ (_: Variable | _: FunctionInvocation | _: Application), e) => collectSelectors(e, v).toSet
533-
case Equals(e, v @ (_: Variable | _: FunctionInvocation | _: Application)) => collectSelectors(e, v).toSet
534543
case FunctionInvocation(_, _, es) => es.flatMap(e => collectSelectors(e, e)).toSet
535544
case Application(_, es) => es.flatMap(e => collectSelectors(e, e)).toSet
536545
case e: Tuple => collectSelectors(e, e).toSet
@@ -661,6 +670,10 @@ trait Templates
661670
if (matchs.nonEmpty) matchers += bp -> matchs
662671
}
663672

673+
for (e <- guardedExprs.getOrElse(pv, Set.empty)) {
674+
pointers ++= resultPointers(encoder)(e)
675+
}
676+
664677
clauses ++= (for ((b,es) <- guardedExprs; e <- es) yield encoder(Implies(b, e)))
665678
clauses ++= eqs.map(encoder)
666679

0 commit comments

Comments
 (0)