@@ -83,13 +83,14 @@ TreeNode::~TreeNode() {
83
83
84
84
void reset (shared_ptr<TreeNode>& node) {
85
85
// cout << node.use_count() << " " << node->value << endl;
86
+ if (!node) return ;
86
87
if (node->left ) {
87
88
reset (node->left );
88
89
}
89
90
if (node->right ) {
90
91
reset (node->right );
91
92
}
92
- node.reset ();
93
+ if (node. use_count () > 1 ) node.reset ();
93
94
}
94
95
95
96
// void TreeNode::Free() {
@@ -434,7 +435,9 @@ shared_ptr<TreeNode> CnfTree::CNF(shared_ptr<TreeNode> node) {
434
435
node->right = CNF (node->right );
435
436
} else if (node->value == " |" ) {
436
437
shared_ptr<TreeNode> leftVar = CNF (node->left );
438
+ // compact_tree(leftVar);
437
439
shared_ptr<TreeNode> rightVar = CNF (node->right );
440
+ // compact_tree(rightVar);
438
441
shared_ptr<TreeNode> d = distr (leftVar, rightVar);
439
442
node = d;
440
443
compact_tree (node);
@@ -466,34 +469,39 @@ shared_ptr<TreeNode> CnfTree::distr(shared_ptr<TreeNode> node1, shared_ptr<TreeN
466
469
return returnValue;
467
470
}
468
471
469
- void CnfTree::compact_tree (shared_ptr<TreeNode> node) {
470
- // if (node->is_compact) return node;
472
+ void CnfTree::compact_tree (shared_ptr<TreeNode>& node) {
471
473
if (node == NULL ) {
472
474
node = NULL ;
475
+ return ;
473
476
}
474
- string a, b;
475
- if ((node->valueType == 1 || node->valueType == 2 )) {
477
+ if (node->valueType ) {
476
478
compact_tree (node->left );
477
- cout << node->left ->value << endl;
479
+ // cout << node->left->value << endl;
480
+ // cout << node->value << endl;
478
481
}
479
482
if (node->valueType == 2 ) {
480
483
compact_tree (node->right );
481
- cout << node->right ->value << endl;
484
+ // cout << node->right->value << endl;
485
+ // cout << node->value << endl;
482
486
}
483
487
if (node->valueType == 2 ) {
484
488
if (node->left == NULL && node->right == NULL ) {
485
489
node = NULL ;
490
+ return ;
486
491
} else if (node->left == NULL ) {
487
492
node = node->right ;
493
+ return ;
488
494
} else if (node->right == NULL ) {
489
495
node = node->left ;
496
+ return ;
490
497
}
491
498
} else if (node->valueType == 1 ) {
492
499
if (node->left == NULL ) {
493
500
node = NULL ;
501
+ return ;
494
502
}
495
503
}
496
- if (node->left && node->left ->value == " true" ) {
504
+ if (node->valueType && node->left ->value == " true" ) {
497
505
if (node->value == " |" ) {
498
506
reset (node->left );
499
507
reset (node->right );
@@ -514,7 +522,7 @@ void CnfTree::compact_tree(shared_ptr<TreeNode> node) {
514
522
node->value = " false" ;
515
523
node->valueType = 0 ;
516
524
}
517
- } else if (node->right && node->right ->value == " true" ) {
525
+ } else if (node->valueType == 2 && node->right ->value == " true" ) {
518
526
if (node->value == " |" ) {
519
527
reset (node->left );
520
528
reset (node->right );
@@ -524,7 +532,7 @@ void CnfTree::compact_tree(shared_ptr<TreeNode> node) {
524
532
reset (node->right );
525
533
node = node->left ;
526
534
}
527
- } else if (node->left && node->left ->value == " false" ) {
535
+ } else if (node->valueType && node->left ->value == " false" ) {
528
536
if (node->value == " &" ) {
529
537
reset (node->left );
530
538
reset (node->right );
@@ -545,7 +553,7 @@ void CnfTree::compact_tree(shared_ptr<TreeNode> node) {
545
553
node->value = " true" ;
546
554
node->valueType = 0 ;
547
555
}
548
- } else if (node->right && node->right ->value == " false" ) {
556
+ } else if (node->valueType == 2 && node->right ->value == " false" ) {
549
557
if (node->value == " &" ) {
550
558
reset (node->left );
551
559
reset (node->right );
@@ -593,7 +601,7 @@ void CnfTree::compact_tree(shared_ptr<TreeNode> node) {
593
601
break ;
594
602
}
595
603
}
596
- if (false && !to_break) {
604
+ if (!to_break) {
597
605
string negationLeft = ReplaceAll (left, " - " , " -" );
598
606
string negationRight = ReplaceAll (right, " - " , " -" );
599
607
vector<string> negationLeftString = split (negationLeft);
@@ -607,9 +615,8 @@ void CnfTree::compact_tree(shared_ptr<TreeNode> node) {
607
615
auto it = negationLeftString.rbegin ();
608
616
if (*it != " |" ) break ;
609
617
negationLeftString.pop_back ();
610
- negationLeftString.insert (negationLeftString.begin (), " |" );
611
618
}
612
- for (int i = 0 ; i < (int )negationLeftString.size () - 3 ; i++) {
619
+ for (int i = 0 ; i < (int )negationLeftString.size () - 1 ; i++) {
613
620
negationLeft += " | " ;
614
621
}
615
622
for (auto str:negationLeftString) {
@@ -623,36 +630,44 @@ void CnfTree::compact_tree(shared_ptr<TreeNode> node) {
623
630
auto it = negationRightString.rbegin ();
624
631
if (*it != " |" ) break ;
625
632
negationRightString.pop_back ();
626
- negationRightString.insert (negationRightString.begin (), " |" );
627
633
}
628
- for (int i = 0 ; i < (int )negationRightString.size () - 3 ; i++) {
634
+ for (int i = 0 ; i < (int )negationRightString.size () - 1 ; i++) {
629
635
negationRight += " | " ;
630
636
}
631
637
for (auto str:negationRightString) {
632
638
negationRight += str + " " ;
633
639
}
634
640
negationRight = negationRight.substr (0 , negationRight.length () - 1 );
635
641
// cout << "negationRight " << negationRight << endl;
636
- if (negationLeftString == negationRightString) {
642
+ // if (negationLeftString == negationRightString) {
643
+ // reset(node);
644
+ // node = make_sub_tree(ReplaceAll(negationLeft, "-", "- "));
645
+ // while(!exp_stack.empty()) exp_stack.pop();
646
+ int count = 0 ;
647
+ for (auto a:negationLeftString) {
648
+ for (auto b:negationRightString) {
649
+ if (a == b) {
650
+ count++;
651
+ }
652
+ }
653
+ }
654
+ if (count == negationLeftString.size ()) {
655
+ reset (node);
656
+ node = make_sub_tree (ReplaceAll (negationRight, " -" , " - " ));
657
+ while (!exp_stack.empty ()) exp_stack.pop ();
658
+ } else if (count == negationRightString.size ()) {
637
659
reset (node);
638
660
node = make_sub_tree (ReplaceAll (negationLeft, " -" , " - " ));
639
661
while (!exp_stack.empty ()) exp_stack.pop ();
640
- if (node->valueType ) {
641
- // cout << "node->value " << node->value << " " << "node->left->value " << node->left->value << endl;
642
- }
643
662
} else {
663
+ // cout << "node->left->value" << node->left->value << endl;
644
664
reset (node->left );
665
+ // cout << "node->right->value" << node->right->value << endl;
645
666
reset (node->right );
646
667
node->left = make_sub_tree (ReplaceAll (negationLeft, " -" , " - " ));
647
668
while (!exp_stack.empty ()) exp_stack.pop ();
648
- if (node->left ->valueType ) {
649
- // cout << "node->left->value " << node->left->value << " " << "node->left->left->value " << node->left->left->value << endl;
650
- }
651
669
node->right = make_sub_tree (ReplaceAll (negationRight, " -" , " - " ));
652
670
while (!exp_stack.empty ()) exp_stack.pop ();
653
- if (node->right ->valueType ) {
654
- // cout << "node->right->value " << node->right->value << " " << "node->right->left->value " << node->right->left->value << endl;
655
- }
656
671
}
657
672
}
658
673
}
@@ -692,7 +707,7 @@ void CnfTree::compact_tree(shared_ptr<TreeNode> node) {
692
707
break ;
693
708
}
694
709
}
695
- if (false && !to_break) {
710
+ if (!to_break) {
696
711
string negationLeft = ReplaceAll (left, " - " , " -" );
697
712
string negationRight = ReplaceAll (right, " - " , " -" );
698
713
vector<string> negationLeftString = split (negationLeft);
@@ -702,7 +717,12 @@ void CnfTree::compact_tree(shared_ptr<TreeNode> node) {
702
717
sort (negationLeftString.begin (), negationLeftString.end ());
703
718
sort (negationRightString.begin (), negationRightString.end ());
704
719
negationLeft = " " ;
705
- for (int i = 0 ; i < (int )negationLeftString.size () - 3 ; i++) {
720
+ while (true ) {
721
+ auto it = negationLeftString.begin ();
722
+ if (*it != " &" ) break ;
723
+ negationLeftString.erase (negationLeftString.begin ());
724
+ }
725
+ for (int i = 0 ; i < (int )negationLeftString.size () - 1 ; i++) {
706
726
negationLeft += " & " ;
707
727
}
708
728
for (auto str:negationLeftString) {
@@ -712,40 +732,54 @@ void CnfTree::compact_tree(shared_ptr<TreeNode> node) {
712
732
// cout << "negationLeft " << negationLeft << endl;
713
733
714
734
negationRight = " " ;
715
- for (int i = 0 ; i < (int )negationRightString.size () - 3 ; i++) {
735
+ while (true ) {
736
+ auto it = negationRightString.begin ();
737
+ if (*it != " &" ) break ;
738
+ negationRightString.erase (negationRightString.begin ());
739
+ }
740
+ for (int i = 0 ; i < (int )negationRightString.size () - 1 ; i++) {
716
741
negationRight += " & " ;
717
742
}
718
743
for (auto str:negationRightString) {
719
744
negationRight += str + " " ;
720
745
}
721
746
negationRight = negationRight.substr (0 , negationRight.length () - 1 );
722
747
// cout << "negationRight " << negationRight << endl;
723
- if (negationLeftString == negationRightString) {
748
+ // if (negationLeftString == negationRightString) {
749
+ // reset(node);
750
+ // node = make_sub_tree(ReplaceAll(negationLeft, "-", "- "));
751
+ // while(!exp_stack.empty()) exp_stack.pop();
752
+ int count = 0 ;
753
+ for (auto a:negationLeftString) {
754
+ for (auto b:negationRightString) {
755
+ if (a == b) {
756
+ count++;
757
+ }
758
+ }
759
+ }
760
+ if (count == negationLeftString.size ()) {
761
+ reset (node);
762
+ node = make_sub_tree (ReplaceAll (negationRight, " -" , " - " ));
763
+ while (!exp_stack.empty ()) exp_stack.pop ();
764
+ } else if (count == negationRightString.size ()) {
724
765
reset (node);
725
766
node = make_sub_tree (ReplaceAll (negationLeft, " -" , " - " ));
726
767
while (!exp_stack.empty ()) exp_stack.pop ();
727
- if (node->valueType ) {
728
- // cout << "node->value " << node->value << " " << "node->left->value " << node->left->value << endl;
729
- }
730
768
} else {
769
+ // cout << "node->left->value" << node->left->value << endl;
731
770
reset (node->left );
771
+ // cout << "node->right->value" << node->right->value << endl;
732
772
reset (node->right );
733
773
node->left = make_sub_tree (ReplaceAll (negationLeft, " -" , " - " ));
734
774
while (!exp_stack.empty ()) exp_stack.pop ();
735
- if (node->left ->valueType ) {
736
- // cout << "node->left->value " << node->left->value << " " << "node->left->left->value " << node->left->left->value << endl;
737
- }
738
775
node->right = make_sub_tree (ReplaceAll (negationRight, " -" , " - " ));
739
776
while (!exp_stack.empty ()) exp_stack.pop ();
740
- if (node->right ->valueType ) {
741
- // cout << "node->right->value " << node->right->value << " " << "node->right->left->value " << node->right->left->value << endl;
742
- }
743
777
}
744
778
}
745
779
}
746
780
}
747
781
node->is_compact = true ;
748
- cout << node->value << endl;
782
+ // cout << node->value << endl;
749
783
}
750
784
751
785
int main (int argc, char ** argv) {
0 commit comments