Skip to content

Commit 7ab1dec

Browse files
Only emitting side_conditions if all occurrences of the same variable are equal (#1155)
In this PR, we inverse the order in which we create the decision tree when a rule has a side condition. Previously, even when we had 2 or more variables with the same name having different values, the side condition decision trees were generated, and we only evaluated the variables matching after evaluating the side condition. After this PR, we inverse this order and evaluate the variables matching first and then the side condition. This issue was discovered in the context of side conditions proof events being emitted and being true but without ever being applied, as we have a mismatch in the variable names and values. This PR fixes: Pi-Squared-Inc/pi2#2124 We added a regression test that reproduced this issue, and it's now fixed!
1 parent fc9602c commit 7ab1dec

File tree

5 files changed

+3308
-7
lines changed

5 files changed

+3308
-7
lines changed

matching/src/main/scala/org/kframework/backend/llvm/matching/Matrix.scala

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -766,12 +766,9 @@ class Matrix private (
766766
Leaf(row.clause.action.ordinal, newVars)
767767
}
768768
// check that all occurrences of the same variable are equal
769-
val nonlinearLeaf = nonlinearPairs.foldRight[DecisionTree](atomicLeaf)((e, dt) =>
770-
e._2.foldRight(dt)((os, dt2) => makeEquality(os._1._1, (os._1._2, os._2._2), dt2))
771-
)
772-
val sc = row.clause.action.scVars match {
769+
val sc: DecisionTree = row.clause.action.scVars match {
773770
// if there is no side condition, continue
774-
case None => nonlinearLeaf
771+
case None => atomicLeaf
775772
case Some(cond) =>
776773
val condVars = cond.map(v => (grouped(v).head._2, grouped(v).head._1.hookAtt))
777774
val newO = SC(row.clause.action.ordinal)
@@ -785,13 +782,16 @@ class Matrix private (
785782
newO,
786783
"BOOL.Bool",
787784
1,
788-
immutable.Seq(("1", immutable.Seq(), nonlinearLeaf), ("0", immutable.Seq(), child)),
785+
immutable.Seq(("1", immutable.Seq(), atomicLeaf), ("0", immutable.Seq(), child)),
789786
None
790787
)
791788
)
792789
}
790+
val nonlinearLeaf = nonlinearPairs.foldRight[DecisionTree](sc)((e, dt) =>
791+
e._2.foldRight(dt)((os, dt2) => makeEquality(os._1._1, (os._1._2, os._2._2), dt2))
792+
)
793793
// fill out the bindings for list range variables
794-
val withRanges = row.clause.listRanges.foldRight(sc) {
794+
val withRanges = row.clause.listRanges.foldRight(nonlinearLeaf) {
795795
case ((o @ Num(_, o2), hd, tl), dt) =>
796796
Function(
797797
"hook_LIST_range_long",
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
LblinitGeneratedTopCell{}(Lbl'Unds'Map'Unds'{}(Lbl'Stop'Map{}(),Lbl'UndsPipe'-'-GT-Unds'{}(inj{SortKConfigVar{}, SortKItem{}}(\dv{SortKConfigVar{}}("$PGM")),inj{SortOps{}, SortKItem{}}(Lblseq{}(Lbl'Hash'init'UndsUndsUnds'SAME-NAME-DIFF-VALUE'Unds'Op'Unds'Int'Unds'Int{}(\dv{SortInt{}}("0"),\dv{SortInt{}}("5")),inj{SortOp{}, SortOps{}}(Lbl'Hash'transferFunds'UndsUndsUndsUnds'SAME-NAME-DIFF-VALUE'Unds'Op'Unds'Int'Unds'Int'Unds'Int{}(\dv{SortInt{}}("1"),\dv{SortInt{}}("0"),\dv{SortInt{}}("1"))))))))
2+
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
version: 13
2+
hook: MAP.concat Lbl'Unds'Map'Unds'{} ()
3+
arg: kore[Lbl'Stop'Map{}()]
4+
arg: kore[Lbl'UndsPipe'-'-GT-Unds'{}(\dv{SortKConfigVar{}}("$PGM"),Lblseq{}(Lbl'Hash'init'UndsUndsUnds'SAME-NAME-DIFF-VALUE'Unds'Op'Unds'Int'Unds'Int{}(\dv{SortInt{}}("0"),\dv{SortInt{}}("5")),Lbl'Hash'transferFunds'UndsUndsUndsUnds'SAME-NAME-DIFF-VALUE'Unds'Op'Unds'Int'Unds'Int'Unds'Int{}(\dv{SortInt{}}("1"),\dv{SortInt{}}("0"),\dv{SortInt{}}("1"))))]
5+
hook result: kore[Lbl'UndsPipe'-'-GT-Unds'{}(\dv{SortKConfigVar{}}("$PGM"),Lblseq{}(Lbl'Hash'init'UndsUndsUnds'SAME-NAME-DIFF-VALUE'Unds'Op'Unds'Int'Unds'Int{}(\dv{SortInt{}}("0"),\dv{SortInt{}}("5")),Lbl'Hash'transferFunds'UndsUndsUndsUnds'SAME-NAME-DIFF-VALUE'Unds'Op'Unds'Int'Unds'Int'Unds'Int{}(\dv{SortInt{}}("1"),\dv{SortInt{}}("0"),\dv{SortInt{}}("1"))))]
6+
function: LblinitGeneratedTopCell{} ()
7+
rule: 231 1
8+
VarInit = kore[Lbl'UndsPipe'-'-GT-Unds'{}(\dv{SortKConfigVar{}}("$PGM"),Lblseq{}(Lbl'Hash'init'UndsUndsUnds'SAME-NAME-DIFF-VALUE'Unds'Op'Unds'Int'Unds'Int{}(\dv{SortInt{}}("0"),\dv{SortInt{}}("5")),Lbl'Hash'transferFunds'UndsUndsUndsUnds'SAME-NAME-DIFF-VALUE'Unds'Op'Unds'Int'Unds'Int'Unds'Int{}(\dv{SortInt{}}("1"),\dv{SortInt{}}("0"),\dv{SortInt{}}("1"))))]
9+
function: LblinitKCell{} (0)
10+
rule: 232 1
11+
VarInit = kore[Lbl'UndsPipe'-'-GT-Unds'{}(\dv{SortKConfigVar{}}("$PGM"),Lblseq{}(Lbl'Hash'init'UndsUndsUnds'SAME-NAME-DIFF-VALUE'Unds'Op'Unds'Int'Unds'Int{}(\dv{SortInt{}}("0"),\dv{SortInt{}}("5")),Lbl'Hash'transferFunds'UndsUndsUndsUnds'SAME-NAME-DIFF-VALUE'Unds'Op'Unds'Int'Unds'Int'Unds'Int{}(\dv{SortInt{}}("1"),\dv{SortInt{}}("0"),\dv{SortInt{}}("1"))))]
12+
hook: MAP.lookup LblMap'Coln'lookup{} (0:0:0:0)
13+
arg: kore[Lbl'UndsPipe'-'-GT-Unds'{}(\dv{SortKConfigVar{}}("$PGM"),Lblseq{}(Lbl'Hash'init'UndsUndsUnds'SAME-NAME-DIFF-VALUE'Unds'Op'Unds'Int'Unds'Int{}(\dv{SortInt{}}("0"),\dv{SortInt{}}("5")),Lbl'Hash'transferFunds'UndsUndsUndsUnds'SAME-NAME-DIFF-VALUE'Unds'Op'Unds'Int'Unds'Int'Unds'Int{}(\dv{SortInt{}}("1"),\dv{SortInt{}}("0"),\dv{SortInt{}}("1"))))]
14+
arg: kore[\dv{SortKConfigVar{}}("$PGM")]
15+
hook result: kore[Lblseq{}(Lbl'Hash'init'UndsUndsUnds'SAME-NAME-DIFF-VALUE'Unds'Op'Unds'Int'Unds'Int{}(\dv{SortInt{}}("0"),\dv{SortInt{}}("5")),Lbl'Hash'transferFunds'UndsUndsUndsUnds'SAME-NAME-DIFF-VALUE'Unds'Op'Unds'Int'Unds'Int'Unds'Int{}(\dv{SortInt{}}("1"),\dv{SortInt{}}("0"),\dv{SortInt{}}("1")))]
16+
function: Lblproject'Coln'Ops{} (0:0)
17+
rule: 313 1
18+
VarK = kore[Lblseq{}(Lbl'Hash'init'UndsUndsUnds'SAME-NAME-DIFF-VALUE'Unds'Op'Unds'Int'Unds'Int{}(\dv{SortInt{}}("0"),\dv{SortInt{}}("5")),Lbl'Hash'transferFunds'UndsUndsUndsUnds'SAME-NAME-DIFF-VALUE'Unds'Op'Unds'Int'Unds'Int'Unds'Int{}(\dv{SortInt{}}("1"),\dv{SortInt{}}("0"),\dv{SortInt{}}("1")))]
19+
function: LblinitAccountsCell{} (1)
20+
rule: 227 0
21+
function: LblinitGeneratedCounterCell{} (2)
22+
rule: 230 0
23+
config: kore[Lbl'-LT-'generatedTop'-GT-'{}(Lbl'-LT-'k'-GT-'{}(kseq{}(Lblseq{}(Lbl'Hash'init'UndsUndsUnds'SAME-NAME-DIFF-VALUE'Unds'Op'Unds'Int'Unds'Int{}(\dv{SortInt{}}("0"),\dv{SortInt{}}("5")),Lbl'Hash'transferFunds'UndsUndsUndsUnds'SAME-NAME-DIFF-VALUE'Unds'Op'Unds'Int'Unds'Int'Unds'Int{}(\dv{SortInt{}}("1"),\dv{SortInt{}}("0"),\dv{SortInt{}}("1"))),dotk{}())),Lbl'-LT-'accounts'-GT-'{}(Lbl'Stop'AccountCellMap{}()),Lbl'-LT-'generatedCounter'-GT-'{}(\dv{SortInt{}}("0")))]
24+
rule: 191 4
25+
Var'Unds'DotVar0 = kore[Lbl'-LT-'generatedCounter'-GT-'{}(\dv{SortInt{}}("0"))]
26+
VarACCT = kore[\dv{SortInt{}}("0")]
27+
VarO = kore[Lbl'Hash'transferFunds'UndsUndsUndsUnds'SAME-NAME-DIFF-VALUE'Unds'Op'Unds'Int'Unds'Int'Unds'Int{}(\dv{SortInt{}}("1"),\dv{SortInt{}}("0"),\dv{SortInt{}}("1"))]
28+
VarVALUE = kore[\dv{SortInt{}}("5")]
29+
config: kore[Lbl'-LT-'generatedTop'-GT-'{}(Lbl'-LT-'k'-GT-'{}(kseq{}(Lbl'Hash'transferFunds'UndsUndsUndsUnds'SAME-NAME-DIFF-VALUE'Unds'Op'Unds'Int'Unds'Int'Unds'Int{}(\dv{SortInt{}}("1"),\dv{SortInt{}}("0"),\dv{SortInt{}}("1")),dotk{}())),Lbl'-LT-'accounts'-GT-'{}(LblAccountCellMapItem{}(Lbl'-LT-'acctID'-GT-'{}(\dv{SortInt{}}("0")),Lbl'-LT-'account'-GT-'{}(Lbl'-LT-'acctID'-GT-'{}(\dv{SortInt{}}("0")),Lbl'-LT-'balance'-GT-'{}(\dv{SortInt{}}("5"))))),Lbl'-LT-'generatedCounter'-GT-'{}(\dv{SortInt{}}("0")))]
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
module SAME-NAME-DIFF-VALUE
2+
imports INT
3+
imports K-EQUAL
4+
imports BOOL
5+
6+
configuration <k> $PGM:Ops </k>
7+
<accounts>
8+
<account multiplicity="*" type="Map">
9+
<acctID> 0 </acctID>
10+
<balance> 0 </balance>
11+
</account>
12+
</accounts>
13+
14+
syntax Ops ::= Op ";" Ops [symbol(seq)]
15+
| Op
16+
17+
syntax Op ::= "#transferFunds" Int Int Int
18+
| "#init" Int Int
19+
20+
syntax NoOp ::= "#finish"
21+
22+
23+
rule <k> #init ACCT VALUE ; O:Op => O </k>
24+
<accounts>
25+
( .Bag
26+
=>
27+
<account>
28+
<acctID> ACCT </acctID>
29+
<balance> VALUE </balance>
30+
</account>
31+
)
32+
</accounts>
33+
34+
rule <k> #transferFunds ACCT ACCT VALUE => .K ... </k>
35+
<account>
36+
<acctID> ACCT </acctID>
37+
<balance> ORIGFROM </balance>
38+
</account>
39+
requires VALUE <=Int ORIGFROM
40+
41+
42+
rule <k> #transferFunds ACCTFROM ACCTTO VALUE => .K ... </k>
43+
<account>
44+
<acctID> ACCTFROM </acctID>
45+
<balance> ORIGFROM => ORIGFROM -Int VALUE </balance>
46+
...
47+
</account>
48+
<account>
49+
<acctID> ACCTTO </acctID>
50+
<balance> ORIGTO => ORIGTO +Int VALUE </balance>
51+
...
52+
</account>
53+
requires ACCTFROM =/=K ACCTTO andBool VALUE <=Int ORIGFROM
54+
[preserves-definedness]
55+
56+
rule <k> #transferFunds ACCTFROM _ACCTTO VALUE => .K ... </k>
57+
<account>
58+
<acctID> ACCTFROM </acctID>
59+
<balance> ORIGFROM </balance>
60+
...
61+
</account>
62+
requires VALUE >Int ORIGFROM
63+
64+
endmodule

0 commit comments

Comments
 (0)