Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
66 commits
Select commit Hold shift + click to select a range
e38d99d
Add SimplifiedExpression
rcosta358 Jun 8, 2026
208249f
Change SimplifiedExpression to SimplifiedPredicate
rcosta358 Jun 8, 2026
92359f3
Requested Changes
rcosta358 Jun 9, 2026
de68c47
Formatting
rcosta358 Jun 9, 2026
8bb6fb4
Minor Changes
rcosta358 Jun 9, 2026
ba977dc
Add VC Substitution
rcosta358 Jun 8, 2026
82eb3be
Add Comments
rcosta358 Jun 8, 2026
63a1c21
SimplifiedPredicate Follow-Up
rcosta358 Jun 8, 2026
36fd1fd
Add `simplifyOnce`
rcosta358 Jun 8, 2026
e8e07d5
Code Refactoring
rcosta358 Jun 9, 2026
27061e9
Add Comment
rcosta358 Jun 9, 2026
47c1844
Code Refactoring
rcosta358 Jun 9, 2026
a3b4f29
Add Fixed Point Iteration
rcosta358 Jun 9, 2026
659a139
Requested Changes
rcosta358 Jun 9, 2026
7f6f9d2
Rename
rcosta358 Jun 9, 2026
2e145d3
Replace `SimplifiedPredicate` with `SimplifiedVCImplication`
rcosta358 Jun 9, 2026
ba81c3a
Refactoring
rcosta358 Jun 9, 2026
43a0bef
Minor Change
rcosta358 Jun 9, 2026
fa7eff5
Add Tests
rcosta358 Jun 11, 2026
607e1b5
Change SimplifiedExpression to SimplifiedPredicate
rcosta358 Jun 8, 2026
0b060bb
Add VC Folding
rcosta358 Jun 9, 2026
7bb0632
Add Fixed Point Iteration
rcosta358 Jun 9, 2026
4c39689
Use SimplifiedVCImplication
rcosta358 Jun 9, 2026
981c63f
Refactoring
rcosta358 Jun 9, 2026
b374c66
Fix
rcosta358 Jun 9, 2026
67b05ce
Refactoring
rcosta358 Jun 9, 2026
9ffbe14
Add Comments
rcosta358 Jun 10, 2026
68c3b42
Refactoring
rcosta358 Jun 10, 2026
eab59f7
Refactoring
rcosta358 Jun 10, 2026
11be88b
Simplify VCFolding
rcosta358 Jun 10, 2026
84f9727
Add Tests
rcosta358 Jun 11, 2026
99131d4
Fixes
rcosta358 Jun 11, 2026
8cde2d2
Update Tests
rcosta358 Jun 11, 2026
ee3919c
Refactor Tests
rcosta358 Jun 11, 2026
cb0cb2e
Update VCImplicationGenerator
rcosta358 Jun 11, 2026
35895a3
Minor Changes
rcosta358 Jun 11, 2026
e4258aa
Minor Changes
rcosta358 Jun 12, 2026
804c7a6
Update Tests
rcosta358 Jun 12, 2026
1043d1a
Refactor Tests
rcosta358 Jun 12, 2026
9fc831a
Add Comments
rcosta358 Jun 13, 2026
b813bb7
Add VC Arithmetic Simplification
rcosta358 Jun 13, 2026
0a04e5b
Add Comments
rcosta358 Jun 13, 2026
e5d9162
Renaming
rcosta358 Jun 13, 2026
f4250de
Update Comments
rcosta358 Jun 13, 2026
334ff7e
Refactor Simplification Passes
rcosta358 Jun 13, 2026
eb9ff24
Add VC Logical Simplification
rcosta358 Jun 13, 2026
d8f9aee
Fix Origins
rcosta358 Jun 13, 2026
f9e4624
Fix Origins
rcosta358 Jun 13, 2026
63aeaf9
Fix Origins
rcosta358 Jun 13, 2026
28c5a0f
Refactor VC Simplification
rcosta358 Jun 14, 2026
8b148b0
Minor Changes
rcosta358 Jun 14, 2026
9bc108f
Minor Changes
rcosta358 Jun 14, 2026
8588a9d
Add VC Binder Simplification
rcosta358 Jun 14, 2026
5fbcef7
Return Null Origin for Unsimplified VCs
rcosta358 Jun 15, 2026
d068108
Fix VC Substitution
rcosta358 Jun 17, 2026
935a168
VC Simplification Refactoring
rcosta358 Jun 17, 2026
5c73350
Use VC Implication Simplification
rcosta358 Jun 17, 2026
e789e05
Remove Expression-Based Simplification Classes
rcosta358 Jun 17, 2026
8932b49
Don't Simplify Expected Type
rcosta358 Jun 17, 2026
ea7ad09
Track Simplification Origins by Full VC Implication
rcosta358 Jun 18, 2026
08ec730
Refactoring
rcosta358 Jun 18, 2026
96f9842
Refactor Tests
rcosta358 Jun 18, 2026
9e76dcf
Add More Tests
rcosta358 Jun 18, 2026
f5cccb1
Assert Origin Not Equal to Simplified
rcosta358 Jun 18, 2026
6512612
Merge branch 'main' into new-origins-approach
rcosta358 Jun 21, 2026
a3988dc
Fix `VCFunctionSubstitution`
rcosta358 Jun 21, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import liquidjava.rj_language.Predicate;
import liquidjava.rj_language.ast.Expression;
import liquidjava.rj_language.ast.formatter.VariableFormatter;
import liquidjava.rj_language.opt.VCSimplificationResult;
import liquidjava.smt.Counterexample;
import spoon.reflect.cu.SourcePosition;

Expand All @@ -20,13 +21,15 @@
public class RefinementError extends LJError {

private final Predicate expected;
private final VCImplication found;
private final VCSimplificationResult found;
private final Counterexample counterexample;

public RefinementError(SourcePosition position, Predicate expected, VCImplication found,
public RefinementError(SourcePosition position, Predicate expected, VCSimplificationResult found,
TranslationTable translationTable, Counterexample counterexample, String customMessage) {
super("Refinement Error", String.format("%s is not a subtype of %s",
found.toPredicate().getExpression().toDisplayString(), expected.getExpression().toDisplayString()),
super("Refinement Error",
String.format("%s is not a subtype of %s",
found.getImplication().toPredicate().getExpression().toDisplayString(),
expected.getExpression().toDisplayString()),
position, translationTable, customMessage);
this.expected = expected;
this.found = found;
Expand All @@ -46,7 +49,7 @@ public String getCounterExampleString() {
return null;

List<String> foundVarNames = new ArrayList<>();
Expression foundExpression = found.toPredicate().getExpression();
Expression foundExpression = getFound().getImplication().toPredicate().getExpression();
Expression expectedExpression = expected.getExpression();
foundExpression.getVariableNames(foundVarNames);
// also keep resolved static-final constants (e.g. Integer.MAX_VALUE) referenced by either side of the
Expand Down Expand Up @@ -77,7 +80,7 @@ public Predicate getExpected() {
return expected;
}

public VCImplication getFound() {
public VCSimplificationResult getFound() {
return found;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import liquidjava.diagnostics.TranslationTable;
import liquidjava.processor.VCImplication;
import liquidjava.rj_language.Predicate;
import liquidjava.rj_language.opt.VCSimplificationResult;
import spoon.reflect.cu.SourcePosition;

/**
Expand All @@ -13,13 +14,13 @@
public class StateRefinementError extends LJError {

private final Predicate expected;
private final VCImplication found;
private final VCSimplificationResult found;

public StateRefinementError(SourcePosition position, Predicate expected, VCImplication found,
public StateRefinementError(SourcePosition position, Predicate expected, VCSimplificationResult found,
TranslationTable translationTable, String customMessage) {
super("State Refinement Error",
String.format("Expected state %s but found %s", expected.getExpression().toDisplayString(),
found.toPredicate().getExpression().toDisplayString()),
found.getImplication().toPredicate().getExpression().toDisplayString()),
position, translationTable, customMessage);
this.expected = expected;
this.found = found;
Expand All @@ -30,6 +31,10 @@ public Predicate getExpected() {
}

public VCImplication getFound() {
return found.getImplication();
}

public VCSimplificationResult getFoundSimplification() {
return found;
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

import liquidjava.rj_language.Predicate;
import liquidjava.rj_language.opt.VCSimplification;
import liquidjava.rj_language.opt.VCSimplificationResult;
import liquidjava.utils.Utils;
import spoon.reflect.reference.CtTypeReference;

Expand Down Expand Up @@ -32,21 +33,6 @@ public VCImplication(VCImplication implication, Predicate ref) {
this.refinement = ref;
}

public VCImplication getOrigin() {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

return null;
}

public Predicate getOriginRefinement() {
VCImplication origin = getOrigin();
if (origin == null)
return refinement.clone();
return origin.getRefinement().clone();
}

public VCImplication copyWithRefinement(Predicate refinement) {
return new VCImplication(this, refinement);
}

public void setNext(VCImplication c) {
next = c;
}
Expand Down Expand Up @@ -89,7 +75,7 @@ public String toString() {
return String.format("%-20s %s", "", refinement.toString());
}

public VCImplication simplify() {
public VCSimplificationResult simplify() {
return VCSimplification.simplifyToFixedPoint(this);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import liquidjava.diagnostics.errors.LJError;
import liquidjava.diagnostics.errors.NotFoundError;
import liquidjava.processor.VCImplication;
import liquidjava.rj_language.opt.VCSimplificationResult;
import liquidjava.processor.context.AliasWrapper;
import liquidjava.processor.context.Context;
import liquidjava.processor.context.GhostFunction;
Expand Down Expand Up @@ -259,12 +260,6 @@ public Predicate getOrigin() {
return this;
}

public VCImplication simplify() {
VCImplication result = new VCImplication(clone()).simplify();
DebugLog.simplification(this.getExpression(), result.getRefinement().getExpression());
return result;
}

private static boolean isBooleanLiteral(Expression expr, boolean value) {
return expr instanceof LiteralBoolean && expr.isBooleanTrue() == value;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package liquidjava.rj_language.opt;

import static liquidjava.rj_language.opt.VCSimplificationUtils.containsVar;
import static liquidjava.rj_language.opt.VCSimplificationUtils.copyWithRefinement;
import static liquidjava.rj_language.opt.VCSimplificationUtils.isFalse;
import static liquidjava.rj_language.opt.VCSimplificationUtils.isTrue;

import liquidjava.processor.SimplifiedVCImplication;
import liquidjava.processor.VCImplication;
import liquidjava.rj_language.Predicate;
import liquidjava.rj_language.ast.LiteralBoolean;
Expand Down Expand Up @@ -41,7 +41,7 @@ private VCImplication simplify(VCImplication implication) {
if (next == null)
return null;

VCImplication result = implication.copyWithRefinement(implication.getRefinement().clone());
VCImplication result = copyWithRefinement(implication, implication.getRefinement().clone());
result.setNext(next);
return result;
}
Expand All @@ -53,17 +53,12 @@ private VCImplication removeTrueBinder(VCImplication implication) {
VCImplication next = implication.getNext();

// ∀x. true => P -> P
if (next != null) {
VCImplication origin = new VCImplication(implication.getName(), implication.getType(),
next.getOriginRefinement());
VCImplication result = new SimplifiedVCImplication(next, next.getRefinement().clone(), origin);
result.setNext(next.getNext() == null ? null : next.getNext().clone());
return result;
}
if (next != null)
return next.clone();

// ∀x. true -> true
Predicate truePredicate = new Predicate(new LiteralBoolean(true));
return new SimplifiedVCImplication(new VCImplication(truePredicate), truePredicate, implication);
return new VCImplication(truePredicate);
}

/**
Expand All @@ -72,7 +67,7 @@ private VCImplication removeTrueBinder(VCImplication implication) {
private VCImplication collapseFalseBinder(VCImplication implication) {
// ∀x. false => P -> true
Predicate truePredicate = new Predicate(new LiteralBoolean(true));
return new SimplifiedVCImplication(new VCImplication(truePredicate), truePredicate, implication);
return new VCImplication(truePredicate);
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package liquidjava.rj_language.opt;

import liquidjava.processor.SimplifiedVCImplication;
import static liquidjava.rj_language.opt.VCSimplificationUtils.copyWithRefinement;

import liquidjava.processor.VCImplication;
import liquidjava.rj_language.Predicate;
import liquidjava.rj_language.ast.Expression;
Expand Down Expand Up @@ -32,7 +33,7 @@ private VCImplication apply(VCImplication implication, C context) {
Expression expression = implication.getRefinement().getExpression();
Expression simplified = simplify(expression, context);
if (!expression.equals(simplified)) {
VCImplication result = new SimplifiedVCImplication(implication, new Predicate(simplified), implication);
VCImplication result = copyWithRefinement(implication, new Predicate(simplified));
result.setNext(implication.getNext() == null ? null : implication.getNext().clone());
return result;
}
Expand All @@ -41,7 +42,7 @@ private VCImplication apply(VCImplication implication, C context) {
if (implication.getNext() == null || implication.getNext().equals(next))
return implication;

VCImplication result = implication.copyWithRefinement(implication.getRefinement().clone());
VCImplication result = copyWithRefinement(implication, implication.getRefinement().clone());
result.setNext(next);
return result;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
package liquidjava.rj_language.opt;

import static liquidjava.rj_language.opt.VCSimplificationUtils.copyWithRefinement;

import java.util.Optional;

import liquidjava.processor.SimplifiedVCImplication;
import liquidjava.processor.VCImplication;
import liquidjava.rj_language.Predicate;
import liquidjava.rj_language.ast.BinaryExpression;
Expand Down Expand Up @@ -46,41 +47,41 @@ private VCImplication substitute(VCImplication implication, VCImplication node,

// skip the source node to remove it from the chain and start substitution from the next node
if (implication == node) {
VCImplication result = implication.copyWithRefinement(implication.getRefinement().clone());
result.setNext(substituteSuffix(implication.getNext(), node, invocation, replacement));
VCImplication result = copyWithRefinement(implication, implication.getRefinement().clone());
result.setNext(substituteSuffix(implication.getNext(), invocation, replacement));
return result;
}

// preserve the current node and continue rewriting the suffix
VCImplication result = implication.copyWithRefinement(implication.getRefinement().clone());
VCImplication result = copyWithRefinement(implication, implication.getRefinement().clone());
result.setNext(substitute(implication.getNext(), node, invocation, replacement));
return result;
}

/**
* Rewrites every node after the source equality with one function substitution
*/
private VCImplication substituteSuffix(VCImplication implication, VCImplication source,
FunctionInvocation invocation, Expression replacement) {
private VCImplication substituteSuffix(VCImplication implication, FunctionInvocation invocation,
Expression replacement) {
if (implication == null)
return null;

VCImplication result = substituteNode(implication, source, invocation, replacement);
result.setNext(substituteSuffix(implication.getNext(), source, invocation, replacement));
VCImplication result = substituteNode(implication, invocation, replacement);
result.setNext(substituteSuffix(implication.getNext(), invocation, replacement));
return result;
}

/**
* Substitutes one exact function invocation inside one VC node while preserving simplification metadata
* Substitutes one exact function invocation inside one VC node
*/
private VCImplication substituteNode(VCImplication implication, VCImplication source, FunctionInvocation invocation,
private VCImplication substituteNode(VCImplication implication, FunctionInvocation invocation,
Expression replacement) {
Expression expression = implication.getRefinement().getExpression().clone();
if (!containsExpression(expression, invocation))
return implication.copyWithRefinement(new Predicate(expression));
return copyWithRefinement(implication, new Predicate(expression));

Expression substituted = expression.substitute(invocation, replacement.clone());
return new SimplifiedVCImplication(implication, new Predicate(substituted), source);
return copyWithRefinement(implication, new Predicate(substituted));
}

/**
Expand Down
Loading
Loading