summaryrefslogtreecommitdiff
path: root/proofs
diff options
context:
space:
mode:
authorajreynol <andrew.j.reynolds@gmail.com>2016-08-15 16:30:07 -0500
committerajreynol <andrew.j.reynolds@gmail.com>2016-08-15 16:30:07 -0500
commit20fc32c0c4a2518673e1cbaa0afb3c4fb284ffe6 (patch)
treeb2698ac7cd23f9336d6b82489547caf788f4db59 /proofs
parentbaaab488c597e3e30dd3b929a5a612ba7fd660af (diff)
Expression sharing on demand in LFSC (replace definitionally equivalent child arguments after successful comparison).
Diffstat (limited to 'proofs')
-rw-r--r--proofs/lfsc_checker/expr.cpp17
1 files changed, 15 insertions, 2 deletions
diff --git a/proofs/lfsc_checker/expr.cpp b/proofs/lfsc_checker/expr.cpp
index 5cb774fbf..784a0ad2f 100644
--- a/proofs/lfsc_checker/expr.cpp
+++ b/proofs/lfsc_checker/expr.cpp
@@ -577,8 +577,21 @@ bool Expr::defeq(Expr *e) {
{
int counter = 0;
while( e1->kids[counter] ){
- if( !e2->kids[counter] || !e1->kids[counter]->defeq( e2->kids[counter] ) )
- return false;
+ if( e1->kids[counter]!=e2->kids[counter] ){
+ if( !e2->kids[counter] || !e1->kids[counter]->defeq( e2->kids[counter] ) )
+ return false;
+ //--- optimization : replace child with equivalent pointer if was defeq
+ if( e1->kids[counter]<e2->kids[counter] ){
+ e1->kids[counter]->dec();
+ e2->kids[counter]->inc();
+ e1->kids[counter] = e2->kids[counter];
+ }else{
+ e2->kids[counter]->dec();
+ e1->kids[counter]->inc();
+ e2->kids[counter] = e1->kids[counter];
+ }
+ }
+ //---
counter++;
}
return e2->kids[counter]==NULL;
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback