@@ -79,9 +79,12 @@ typedef struct PredIterInfoData
79
79
(info).cleanup_fn(&(info)); \
80
80
} while (0)
81
81
82
+ typedef int ImplicationType ;
83
+ #define STRONG ((ImplicationType) 0x01)
84
+ #define WEAK ((ImplicationType) 0x02)
82
85
83
86
static bool predicate_implied_by_recurse (Node * clause , Node * predicate ,
84
- bool weak );
87
+ ImplicationType implication_mask );
85
88
static bool predicate_refuted_by_recurse (Node * clause , Node * predicate ,
86
89
bool weak );
87
90
static PredClass predicate_classify (Node * clause , PredIterInfo info );
@@ -96,11 +99,11 @@ static void arrayexpr_startup_fn(Node *clause, PredIterInfo info);
96
99
static Node * arrayexpr_next_fn (PredIterInfo info );
97
100
static void arrayexpr_cleanup_fn (PredIterInfo info );
98
101
static bool predicate_implied_by_simple_clause (Expr * predicate , Node * clause ,
99
- bool weak );
102
+ ImplicationType implication_mask );
100
103
static bool predicate_refuted_by_simple_clause (Expr * predicate , Node * clause ,
101
104
bool weak );
102
105
static bool predicate_implied_not_null_by_clause (Expr * predicate , Node * clause ,
103
- bool weak );
106
+ ImplicationType implication_mask );
104
107
static Node * extract_not_arg (Node * clause );
105
108
static Node * extract_strong_not_arg (Node * clause );
106
109
static bool clause_is_strict_for (Node * clause , Node * subexpr , bool allow_false );
@@ -178,7 +181,7 @@ predicate_implied_by(List *predicate_list, List *clause_list,
178
181
c = (Node * ) clause_list ;
179
182
180
183
/* And away we go ... */
181
- return predicate_implied_by_recurse (c , p , weak );
184
+ return predicate_implied_by_recurse (c , p , weak ? WEAK : STRONG );
182
185
}
183
186
184
187
/*
@@ -295,7 +298,7 @@ predicate_refuted_by(List *predicate_list, List *clause_list,
295
298
*/
296
299
static bool
297
300
predicate_implied_by_recurse (Node * clause , Node * predicate ,
298
- bool weak )
301
+ ImplicationType implication_mask )
299
302
{
300
303
PredIterInfoData clause_info ;
301
304
PredIterInfoData pred_info ;
@@ -323,7 +326,7 @@ predicate_implied_by_recurse(Node *clause, Node *predicate,
323
326
iterate_begin (pitem , predicate , pred_info )
324
327
{
325
328
if (!predicate_implied_by_recurse (clause , pitem ,
326
- weak ))
329
+ implication_mask ))
327
330
{
328
331
result = false;
329
332
break ;
@@ -343,7 +346,7 @@ predicate_implied_by_recurse(Node *clause, Node *predicate,
343
346
iterate_begin (pitem , predicate , pred_info )
344
347
{
345
348
if (predicate_implied_by_recurse (clause , pitem ,
346
- weak ))
349
+ implication_mask ))
347
350
{
348
351
result = true;
349
352
break ;
@@ -361,7 +364,7 @@ predicate_implied_by_recurse(Node *clause, Node *predicate,
361
364
iterate_begin (citem , clause , clause_info )
362
365
{
363
366
if (predicate_implied_by_recurse (citem , predicate ,
364
- weak ))
367
+ implication_mask ))
365
368
{
366
369
result = true;
367
370
break ;
@@ -379,7 +382,7 @@ predicate_implied_by_recurse(Node *clause, Node *predicate,
379
382
iterate_begin (citem , clause , clause_info )
380
383
{
381
384
if (predicate_implied_by_recurse (citem , predicate ,
382
- weak ))
385
+ implication_mask ))
383
386
{
384
387
result = true;
385
388
break ;
@@ -407,7 +410,7 @@ predicate_implied_by_recurse(Node *clause, Node *predicate,
407
410
iterate_begin (pitem , predicate , pred_info )
408
411
{
409
412
if (predicate_implied_by_recurse (citem , pitem ,
410
- weak ))
413
+ implication_mask ))
411
414
{
412
415
presult = true;
413
416
break ;
@@ -435,7 +438,7 @@ predicate_implied_by_recurse(Node *clause, Node *predicate,
435
438
iterate_begin (citem , clause , clause_info )
436
439
{
437
440
if (!predicate_implied_by_recurse (citem , predicate ,
438
- weak ))
441
+ implication_mask ))
439
442
{
440
443
result = false;
441
444
break ;
@@ -458,7 +461,7 @@ predicate_implied_by_recurse(Node *clause, Node *predicate,
458
461
iterate_begin (pitem , predicate , pred_info )
459
462
{
460
463
if (!predicate_implied_by_recurse (clause , pitem ,
461
- weak ))
464
+ implication_mask ))
462
465
{
463
466
result = false;
464
467
break ;
@@ -476,7 +479,7 @@ predicate_implied_by_recurse(Node *clause, Node *predicate,
476
479
iterate_begin (pitem , predicate , pred_info )
477
480
{
478
481
if (predicate_implied_by_recurse (clause , pitem ,
479
- weak ))
482
+ implication_mask ))
480
483
{
481
484
result = true;
482
485
break ;
@@ -493,7 +496,7 @@ predicate_implied_by_recurse(Node *clause, Node *predicate,
493
496
return
494
497
predicate_implied_by_simple_clause ((Expr * ) predicate ,
495
498
clause ,
496
- weak );
499
+ implication_mask );
497
500
}
498
501
break ;
499
502
}
@@ -627,7 +630,7 @@ predicate_refuted_by_recurse(Node *clause, Node *predicate,
627
630
not_arg = extract_not_arg (predicate );
628
631
if (not_arg &&
629
632
predicate_implied_by_recurse (clause , not_arg ,
630
- false ))
633
+ STRONG ))
631
634
return true;
632
635
633
636
/*
@@ -709,7 +712,7 @@ predicate_refuted_by_recurse(Node *clause, Node *predicate,
709
712
not_arg = extract_not_arg (predicate );
710
713
if (not_arg &&
711
714
predicate_implied_by_recurse (clause , not_arg ,
712
- false ))
715
+ STRONG ))
713
716
return true;
714
717
715
718
/*
@@ -736,26 +739,24 @@ predicate_refuted_by_recurse(Node *clause, Node *predicate,
736
739
* If A is a strong NOT-clause, A R=> B if B => A's arg
737
740
*
738
741
* Since A is strong, we may assume A's arg is false (not just
739
- * not-true). If B weakly implies A's arg, then B can be neither
740
- * true nor null, so that strong refutation is proven. If B
741
- * strongly implies A's arg, then B cannot be true, so that weak
742
- * refutation is proven.
742
+ * not-true). If B strongly implies A's arg, then B cannot be true,
743
+ * so that weak refutation is proven. If B weakly implies A's arg,
744
+ * then B can be neither true nor null, so that strong refutation
745
+ * are proven. In that case we can also prove weak refutation since
746
+ * if B must be false, then surely it is not true.
743
747
*/
744
748
not_arg = extract_strong_not_arg (clause );
745
- if (not_arg &&
746
- predicate_implied_by_recurse (predicate , not_arg ,
747
- !weak ))
748
- return true;
749
+ if (not_arg )
750
+ {
751
+ int useful_implications = weak ? STRONG : WEAK ;
749
752
750
- /*
751
- * Because weak refutation expands the allowed outcomes for B
752
- * from "false" to "false or null", we can additionally prove
753
- * weak refutation in the case that strong refutation is proven.
754
- */
755
- if (weak && not_arg &&
756
- predicate_implied_by_recurse (predicate , not_arg ,
757
- true))
758
- return true;
753
+ if (weak )
754
+ useful_implications |= WEAK ;
755
+
756
+ if (predicate_implied_by_recurse (predicate , not_arg ,
757
+ useful_implications ))
758
+ return true;
759
+ }
759
760
760
761
switch (pclass )
761
762
{
@@ -805,7 +806,7 @@ predicate_refuted_by_recurse(Node *clause, Node *predicate,
805
806
not_arg = extract_not_arg (predicate );
806
807
if (not_arg &&
807
808
predicate_implied_by_recurse (clause , not_arg ,
808
- false ))
809
+ STRONG ))
809
810
return true;
810
811
811
812
/*
@@ -1113,8 +1114,12 @@ arrayexpr_cleanup_fn(PredIterInfo info)
1113
1114
*/
1114
1115
static bool
1115
1116
predicate_implied_by_simple_clause (Expr * predicate , Node * clause ,
1116
- bool weak )
1117
+ ImplicationType implication_mask )
1117
1118
{
1119
+ bool weak = implication_mask & WEAK ;
1120
+ bool strong = implication_mask & STRONG ;
1121
+
1122
+
1118
1123
/* Allow interrupting long proof attempts */
1119
1124
CHECK_FOR_INTERRUPTS ();
1120
1125
@@ -1302,7 +1307,7 @@ predicate_implied_by_simple_clause(Expr *predicate, Node *clause,
1302
1307
* must be not null.
1303
1308
*/
1304
1309
if (predicate_implied_not_null_by_clause (predntest -> arg ,
1305
- clause , weak ))
1310
+ clause , implication_mask ))
1306
1311
return true;
1307
1312
break ;
1308
1313
case IS_NULL :
@@ -1332,7 +1337,7 @@ predicate_implied_by_simple_clause(Expr *predicate, Node *clause,
1332
1337
* We can only prove strong implication here since
1333
1338
* "null is true" is false rather than null.
1334
1339
*/
1335
- if (! weak && equal (clause , predbtest -> arg ))
1340
+ if (strong && equal (clause , predbtest -> arg ))
1336
1341
return true;
1337
1342
break ;
1338
1343
case IS_FALSE :
@@ -1342,7 +1347,7 @@ predicate_implied_by_simple_clause(Expr *predicate, Node *clause,
1342
1347
* We can only prove strong implication here since "not
1343
1348
* null" is null rather than true.
1344
1349
*/
1345
- if (! weak && is_notclause (clause ) &&
1350
+ if (strong && is_notclause (clause ) &&
1346
1351
equal (get_notclausearg (clause ), predbtest -> arg ))
1347
1352
return true;
1348
1353
break ;
@@ -1401,7 +1406,7 @@ predicate_implied_by_simple_clause(Expr *predicate, Node *clause,
1401
1406
*
1402
1407
* For example: truth of x implies x is not unknown.
1403
1408
*/
1404
- if (predicate_implied_not_null_by_clause (predbtest -> arg , clause , weak ))
1409
+ if (predicate_implied_not_null_by_clause (predbtest -> arg , clause , implication_mask ))
1405
1410
return true;
1406
1411
break ;
1407
1412
}
@@ -1444,7 +1449,7 @@ predicate_implied_by_simple_clause(Expr *predicate, Node *clause,
1444
1449
* cycles on at this point.
1445
1450
*/
1446
1451
static bool
1447
- predicate_implied_not_null_by_clause (Expr * predicate , Node * clause , bool weak )
1452
+ predicate_implied_not_null_by_clause (Expr * predicate , Node * clause , ImplicationType implication_mask )
1448
1453
{
1449
1454
switch (nodeTag (clause ))
1450
1455
{
@@ -1517,7 +1522,7 @@ predicate_implied_not_null_by_clause(Expr *predicate, Node *clause, bool weak)
1517
1522
* work for weak implication, though, since the clause yielding the
1518
1523
* non-false value NULL means the predicate will evaluate to false.
1519
1524
*/
1520
- if (! weak && clause_is_strict_for (clause , (Node * ) predicate , true))
1525
+ if (implication_mask & STRONG && clause_is_strict_for (clause , (Node * ) predicate , true))
1521
1526
return true;
1522
1527
1523
1528
return false;
@@ -1578,7 +1583,7 @@ predicate_refuted_by_simple_clause(Expr *predicate, Node *clause,
1578
1583
* = false" would mean both our clause and our
1579
1584
* predicate would evaluate to "false".
1580
1585
*/
1581
- if (predicate_implied_not_null_by_clause (clausentest -> arg , (Node * ) predicate , true ))
1586
+ if (predicate_implied_not_null_by_clause (clausentest -> arg , (Node * ) predicate , WEAK ))
1582
1587
return true;
1583
1588
1584
1589
/*
@@ -1588,7 +1593,7 @@ predicate_refuted_by_simple_clause(Expr *predicate, Node *clause,
1588
1593
* in the predicate, it's known immutable).
1589
1594
*/
1590
1595
if (weak &&
1591
- clause_is_strict_for ((Node * ) predicate , (Node * ) clausentest -> arg , true ))
1596
+ clause_is_strict_for ((Node * ) predicate , (Node * ) clausentest -> arg , WEAK ))
1592
1597
return true;
1593
1598
1594
1599
return false; /* we can't succeed below... */
@@ -1665,7 +1670,7 @@ predicate_refuted_by_simple_clause(Expr *predicate, Node *clause,
1665
1670
* = false" would mean both our clause and our
1666
1671
* predicate would evaluate to "false".
1667
1672
*/
1668
- if (predicate_implied_not_null_by_clause (clausebtest -> arg , (Node * ) predicate , true ))
1673
+ if (predicate_implied_not_null_by_clause (clausebtest -> arg , (Node * ) predicate , WEAK ))
1669
1674
return true;
1670
1675
1671
1676
/*
@@ -1728,7 +1733,7 @@ predicate_refuted_by_simple_clause(Expr *predicate, Node *clause,
1728
1733
* refutation is a strict superset of weak
1729
1734
* refutation.
1730
1735
*/
1731
- if (predicate_implied_not_null_by_clause (predntest -> arg , clause , false ))
1736
+ if (predicate_implied_not_null_by_clause (predntest -> arg , clause , STRONG ))
1732
1737
return true;
1733
1738
}
1734
1739
break ;
@@ -1759,7 +1764,7 @@ predicate_refuted_by_simple_clause(Expr *predicate, Node *clause,
1759
1764
* refutation is a strict superset of weak
1760
1765
* refutation.
1761
1766
*/
1762
- if (predicate_implied_not_null_by_clause (predbtest -> arg , clause , false ))
1767
+ if (predicate_implied_not_null_by_clause (predbtest -> arg , clause , STRONG ))
1763
1768
return true;
1764
1769
1765
1770
return false; /* we can't succeed below... */
0 commit comments