Skip to content
Snippets Groups Projects
Commit 7159d3a2 authored by Nicolas Voirol's avatar Nicolas Voirol
Browse files

Fix for functions with no pathVars

parent d6f273eb
No related branches found
No related tags found
No related merge requests found
...@@ -54,7 +54,7 @@ object LambdaTemplate { ...@@ -54,7 +54,7 @@ object LambdaTemplate {
ids, ids,
encoder, encoder,
manager, manager,
pathVar._2, pathVar,
arguments, arguments,
condVars, condVars,
exprVars, exprVars,
...@@ -76,7 +76,7 @@ class LambdaTemplate[T] private ( ...@@ -76,7 +76,7 @@ class LambdaTemplate[T] private (
val ids: (Identifier, T), val ids: (Identifier, T),
val encoder: TemplateEncoder[T], val encoder: TemplateEncoder[T],
val manager: QuantificationManager[T], val manager: QuantificationManager[T],
val start: T, val pathVar: (Identifier, T),
val arguments: Seq[(Identifier, T)], val arguments: Seq[(Identifier, T)],
val condVars: Map[Identifier, T], val condVars: Map[Identifier, T],
val exprVars: Map[Identifier, T], val exprVars: Map[Identifier, T],
...@@ -122,7 +122,7 @@ class LambdaTemplate[T] private ( ...@@ -122,7 +122,7 @@ class LambdaTemplate[T] private (
ids._1 -> substituter(ids._2), ids._1 -> substituter(ids._2),
encoder, encoder,
manager, manager,
newStart, pathVar._1 -> newStart,
arguments, arguments,
condVars, condVars,
exprVars, exprVars,
......
...@@ -45,7 +45,7 @@ case class Matcher[T](caller: T, tpe: TypeTree, args: Seq[Either[T, Matcher[T]]] ...@@ -45,7 +45,7 @@ case class Matcher[T](caller: T, tpe: TypeTree, args: Seq[Either[T, Matcher[T]]]
class QuantificationTemplate[T]( class QuantificationTemplate[T](
val quantificationManager: QuantificationManager[T], val quantificationManager: QuantificationManager[T],
val start: T, val pathVar: (Identifier, T),
val qs: (Identifier, T), val qs: (Identifier, T),
val q2s: (Identifier, T), val q2s: (Identifier, T),
val insts: (Identifier, T), val insts: (Identifier, T),
...@@ -60,10 +60,12 @@ class QuantificationTemplate[T]( ...@@ -60,10 +60,12 @@ class QuantificationTemplate[T](
val matchers: Map[T, Set[Matcher[T]]], val matchers: Map[T, Set[Matcher[T]]],
val lambdas: Seq[LambdaTemplate[T]]) { val lambdas: Seq[LambdaTemplate[T]]) {
lazy val start = pathVar._2
def substitute(substituter: T => T): QuantificationTemplate[T] = { def substitute(substituter: T => T): QuantificationTemplate[T] = {
new QuantificationTemplate[T]( new QuantificationTemplate[T](
quantificationManager, quantificationManager,
substituter(start), pathVar._1 -> substituter(start),
qs, qs,
q2s, q2s,
insts, insts,
...@@ -114,7 +116,7 @@ object QuantificationTemplate { ...@@ -114,7 +116,7 @@ object QuantificationTemplate {
substMap = subst + q2s + insts + guards + qs) substMap = subst + q2s + insts + guards + qs)
new QuantificationTemplate[T](quantificationManager, new QuantificationTemplate[T](quantificationManager,
pathVar._2, qs, q2s, insts, guards._2, quantifiers, pathVar, qs, q2s, insts, guards._2, quantifiers,
condVars, exprVars, condTree, clauses, blockers, applications, matchers, lambdas) condVars, exprVars, condTree, clauses, blockers, applications, matchers, lambdas)
} }
} }
...@@ -328,7 +330,7 @@ class QuantificationManager[T](encoder: TemplateEncoder[T]) extends LambdaManage ...@@ -328,7 +330,7 @@ class QuantificationManager[T](encoder: TemplateEncoder[T]) extends LambdaManage
} }
private trait MatcherQuantification { private trait MatcherQuantification {
val start: T val pathVar: (Identifier, T)
val quantified: Set[T] val quantified: Set[T]
val matchers: Set[Matcher[T]] val matchers: Set[Matcher[T]]
val allMatchers: Map[T, Set[Matcher[T]]] val allMatchers: Map[T, Set[Matcher[T]]]
...@@ -340,6 +342,8 @@ class QuantificationManager[T](encoder: TemplateEncoder[T]) extends LambdaManage ...@@ -340,6 +342,8 @@ class QuantificationManager[T](encoder: TemplateEncoder[T]) extends LambdaManage
val applications: Map[T, Set[App[T]]] val applications: Map[T, Set[App[T]]]
val lambdas: Seq[LambdaTemplate[T]] val lambdas: Seq[LambdaTemplate[T]]
lazy val start = pathVar._2
private lazy val depth = matchers.map(matcherDepth).max private lazy val depth = matchers.map(matcherDepth).max
private lazy val transMatchers: Set[Matcher[T]] = (for { private lazy val transMatchers: Set[Matcher[T]] = (for {
(b, ms) <- allMatchers.toSeq (b, ms) <- allMatchers.toSeq
...@@ -438,7 +442,7 @@ class QuantificationManager[T](encoder: TemplateEncoder[T]) extends LambdaManage ...@@ -438,7 +442,7 @@ class QuantificationManager[T](encoder: TemplateEncoder[T]) extends LambdaManage
} }
val baseSubstMap = exprVars.map { case (id, idT) => idT -> encoder.encodeId(id) } ++ val baseSubstMap = exprVars.map { case (id, idT) => idT -> encoder.encodeId(id) } ++
freshConds(enabler, condVars, condTree) freshConds(pathVar._1 -> enabler, condVars, condTree)
val lambdaSubstMap = lambdas map (lambda => lambda.ids._2 -> encoder.encodeId(lambda.ids._1)) val lambdaSubstMap = lambdas map (lambda => lambda.ids._2 -> encoder.encodeId(lambda.ids._1))
val substMap = subst.mapValues(Matcher.argValue) ++ baseSubstMap ++ lambdaSubstMap ++ instanceSubst(enablers) val substMap = subst.mapValues(Matcher.argValue) ++ baseSubstMap ++ lambdaSubstMap ++ instanceSubst(enablers)
...@@ -473,7 +477,7 @@ class QuantificationManager[T](encoder: TemplateEncoder[T]) extends LambdaManage ...@@ -473,7 +477,7 @@ class QuantificationManager[T](encoder: TemplateEncoder[T]) extends LambdaManage
} }
private class Quantification ( private class Quantification (
val start: T, val pathVar: (Identifier, T),
val qs: (Identifier, T), val qs: (Identifier, T),
val q2s: (Identifier, T), val q2s: (Identifier, T),
val insts: (Identifier, T), val insts: (Identifier, T),
...@@ -520,7 +524,7 @@ class QuantificationManager[T](encoder: TemplateEncoder[T]) extends LambdaManage ...@@ -520,7 +524,7 @@ class QuantificationManager[T](encoder: TemplateEncoder[T]) extends LambdaManage
} }
private class LambdaAxiom ( private class LambdaAxiom (
val start: T, val pathVar: (Identifier, T),
val blocker: T, val blocker: T,
val guardVar: T, val guardVar: T,
val quantified: Set[T], val quantified: Set[T],
...@@ -599,7 +603,7 @@ class QuantificationManager[T](encoder: TemplateEncoder[T]) extends LambdaManage ...@@ -599,7 +603,7 @@ class QuantificationManager[T](encoder: TemplateEncoder[T]) extends LambdaManage
val enablingClause = encoder.mkImplies(guardT, blockerT) val enablingClause = encoder.mkImplies(guardT, blockerT)
instantiateAxiom( instantiateAxiom(
substMap(template.start), template.pathVar._1 -> substMap(template.start),
blockerT, blockerT,
guardT, guardT,
quantifiers, quantifiers,
...@@ -621,7 +625,7 @@ class QuantificationManager[T](encoder: TemplateEncoder[T]) extends LambdaManage ...@@ -621,7 +625,7 @@ class QuantificationManager[T](encoder: TemplateEncoder[T]) extends LambdaManage
} }
def instantiateAxiom( def instantiateAxiom(
start: T, pathVar: (Identifier, T),
blocker: T, blocker: T,
guardVar: T, guardVar: T,
quantifiers: Seq[(Identifier, T)], quantifiers: Seq[(Identifier, T)],
...@@ -641,7 +645,7 @@ class QuantificationManager[T](encoder: TemplateEncoder[T]) extends LambdaManage ...@@ -641,7 +645,7 @@ class QuantificationManager[T](encoder: TemplateEncoder[T]) extends LambdaManage
var instantiation = Instantiation.empty[T] var instantiation = Instantiation.empty[T]
for (matchers <- matchQuorums) { for (matchers <- matchQuorums) {
val axiom = new LambdaAxiom(start, blocker, guardVar, quantified, val axiom = new LambdaAxiom(pathVar, blocker, guardVar, quantified,
matchers, allMatchers, condVars, exprVars, condTree, matchers, allMatchers, condVars, exprVars, condTree,
clauses, blockers, applications, lambdas clauses, blockers, applications, lambdas
) )
...@@ -679,7 +683,7 @@ class QuantificationManager[T](encoder: TemplateEncoder[T]) extends LambdaManage ...@@ -679,7 +683,7 @@ class QuantificationManager[T](encoder: TemplateEncoder[T]) extends LambdaManage
val substituter = encoder.substitute(subst) val substituter = encoder.substitute(subst)
val quantification = new Quantification( val quantification = new Quantification(
substituter(template.start), template.pathVar._1 -> substituter(template.start),
template.qs._1 -> newQ, template.qs._1 -> newQ,
template.q2s, template.insts, template.guardVar, template.q2s, template.insts, template.guardVar,
quantified, quantified,
......
...@@ -62,7 +62,7 @@ trait Template[T] { self => ...@@ -62,7 +62,7 @@ trait Template[T] { self =>
val encoder : TemplateEncoder[T] val encoder : TemplateEncoder[T]
val manager : QuantificationManager[T] val manager : QuantificationManager[T]
val start : T val pathVar: (Identifier, T)
val args : Seq[T] val args : Seq[T]
val condVars : Map[Identifier, T] val condVars : Map[Identifier, T]
val exprVars : Map[Identifier, T] val exprVars : Map[Identifier, T]
...@@ -74,6 +74,8 @@ trait Template[T] { self => ...@@ -74,6 +74,8 @@ trait Template[T] { self =>
val matchers : Map[T, Set[Matcher[T]]] val matchers : Map[T, Set[Matcher[T]]]
val lambdas : Seq[LambdaTemplate[T]] val lambdas : Seq[LambdaTemplate[T]]
lazy val start = pathVar._2
private var substCache : Map[Seq[T],Map[T,T]] = Map.empty private var substCache : Map[Seq[T],Map[T,T]] = Map.empty
def instantiate(aVar: T, args: Seq[T]): Instantiation[T] = { def instantiate(aVar: T, args: Seq[T]): Instantiation[T] = {
...@@ -82,7 +84,7 @@ trait Template[T] { self => ...@@ -82,7 +84,7 @@ trait Template[T] { self =>
case Some(subst) => subst case Some(subst) => subst
case None => case None =>
val subst = exprVars.map { case (id, idT) => idT -> encoder.encodeId(id) } ++ val subst = exprVars.map { case (id, idT) => idT -> encoder.encodeId(id) } ++
manager.freshConds(aVar, condVars, condTree) ++ manager.freshConds(pathVar._1 -> aVar, condVars, condTree) ++
(this.args zip args) (this.args zip args)
substCache += args -> subst substCache += args -> subst
subst subst
...@@ -303,7 +305,7 @@ object FunctionTemplate { ...@@ -303,7 +305,7 @@ object FunctionTemplate {
tfd, tfd,
encoder, encoder,
manager, manager,
pathVar._2, pathVar,
arguments.map(_._2), arguments.map(_._2),
condVars, condVars,
exprVars, exprVars,
...@@ -324,7 +326,7 @@ class FunctionTemplate[T] private( ...@@ -324,7 +326,7 @@ class FunctionTemplate[T] private(
val tfd: TypedFunDef, val tfd: TypedFunDef,
val encoder: TemplateEncoder[T], val encoder: TemplateEncoder[T],
val manager: QuantificationManager[T], val manager: QuantificationManager[T],
val start: T, val pathVar: (Identifier, T),
val args: Seq[T], val args: Seq[T],
val condVars: Map[Identifier, T], val condVars: Map[Identifier, T],
val exprVars: Map[Identifier, T], val exprVars: Map[Identifier, T],
...@@ -358,10 +360,9 @@ class TemplateManager[T](protected[templates] val encoder: TemplateEncoder[T]) e ...@@ -358,10 +360,9 @@ class TemplateManager[T](protected[templates] val encoder: TemplateEncoder[T]) e
def push(): Unit = incrementals.foreach(_.push()) def push(): Unit = incrementals.foreach(_.push())
def pop(): Unit = incrementals.foreach(_.pop()) def pop(): Unit = incrementals.foreach(_.pop())
def freshConds(path: T, condVars: Map[Identifier, T], tree: Map[Identifier, Set[Identifier]]): Map[T, T] = { def freshConds(path: (Identifier, T), condVars: Map[Identifier, T], tree: Map[Identifier, Set[Identifier]]): Map[T, T] = {
val subst = condVars.map { case (id, idT) => idT -> encoder.encodeId(id) } val subst = condVars.map { case (id, idT) => idT -> encoder.encodeId(id) }
val pathVar = tree.keys.filter(id => !condVars.isDefinedAt(id)).head val mapping = condVars.mapValues(subst) + path
val mapping = condVars.mapValues(subst) + (pathVar -> path)
for ((parent, children) <- tree; ep = mapping(parent); child <- children) { for ((parent, children) <- tree; ep = mapping(parent); child <- children) {
val ec = mapping(child) val ec = mapping(child)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment