@@ -514,23 +514,32 @@ trait Templates
514
514
515
515
object Template {
516
516
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
+ }
522
521
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
+ }
526
529
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 ]
529
535
}
530
536
537
+ pointers.map(p => encoder(p._1) -> encoder(p._2))
538
+ }
539
+
540
+ def lambdaPointers (encoder : Expr => Encoded )(expr : Expr ): Map [Encoded , Encoded ] = {
541
+
531
542
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
534
543
case FunctionInvocation (_, _, es) => es.flatMap(e => collectSelectors(e, e)).toSet
535
544
case Application (_, es) => es.flatMap(e => collectSelectors(e, e)).toSet
536
545
case e : Tuple => collectSelectors(e, e).toSet
@@ -661,6 +670,10 @@ trait Templates
661
670
if (matchs.nonEmpty) matchers += bp -> matchs
662
671
}
663
672
673
+ for (e <- guardedExprs.getOrElse(pv, Set .empty)) {
674
+ pointers ++= resultPointers(encoder)(e)
675
+ }
676
+
664
677
clauses ++= (for ((b,es) <- guardedExprs; e <- es) yield encoder(Implies (b, e)))
665
678
clauses ++= eqs.map(encoder)
666
679
0 commit comments