|
1667 | 1667 | negation_helper(not(factNOTRealDestructor(RealDestructor))),
|
1668 | 1668 | true.
|
1669 | 1669 |
|
1670 |
| -tryNegation(G) :- |
1671 |
| - loginfoln('Guessing ~Q.', negation_commit(G)), |
1672 |
| - try_assert(negation_commit(G)). |
| 1670 | +tryDelay((G,P,Commit)) :- |
| 1671 | + try_retract(delay_queue(G, P, Commit)), |
1673 | 1672 |
|
1674 |
| -tryNOTNegation(G) :- |
1675 |
| - loginfoln('Guessing ~Q.', negation_fail(G)), |
1676 |
| - try_assert(negation_fail(G)). |
| 1673 | + % Do nothing if we've already committed one way or the other |
| 1674 | + %% (not(G) -> true; |
| 1675 | + %% delay_goal(G, _) -> true; |
| 1676 | + %% delay_fail(G) -> true; |
| 1677 | + |
| 1678 | + loginfoln('Guessing ~Q.', delay_goal(G, Commit)), |
| 1679 | + try_assert(delay_goal(G, Commit))). |
| 1680 | + |
| 1681 | +tryNOTDelay((G,P)) :- |
| 1682 | + loginfoln('tryNOTDelay'), |
| 1683 | + try_retract(delay_queue(G, P, Commit)), |
| 1684 | + |
| 1685 | + % Do nothing if we've already committed one way or the other |
| 1686 | + %% (not(G) -> true; |
| 1687 | + %% delay_goal(G, _) -> true; |
| 1688 | + %% delay_fail(G) -> true; |
| 1689 | + |
| 1690 | + loginfoln('Guessing ~Q.', delay_fail(G)), |
| 1691 | + try_assert(delay_fail(G))). |
| 1692 | + |
| 1693 | +tryOrNOTDelay((G, P)) :- |
| 1694 | + % XXX Optimization for not(G)... |
| 1695 | + |
| 1696 | + try_retract(delay_queue(G, P)), |
| 1697 | + |
| 1698 | + % Do nothing if we've already committed one way or the other |
| 1699 | + delay_goal(G, _) -> true; |
| 1700 | + delay_fail(G) -> true; |
1677 | 1701 |
|
1678 |
| -tryOrNOTNegation(G) :- |
1679 |
| - %likelyDeletingDestructor(Method, _RealDestructor), |
1680 |
| - doNotGuessHelper(negation_commit(G), |
1681 |
| - negation_fail(G)), |
1682 | 1702 | (
|
1683 |
| - tryNegation(G); |
1684 |
| - tryNOTNegation(G); |
1685 |
| - logwarnln('Something is wrong upstream: ~Q.', negation(Method)), |
| 1703 | + tryDelay(G); |
| 1704 | + tryNOTDelay(G); |
| 1705 | + logwarnln('Something is wrong upstream: ~Q.', delay(Method)), |
1686 | 1706 | fail
|
1687 | 1707 | ).
|
1688 | 1708 |
|
1689 |
| -guessNegation(Out) :- |
1690 |
| - reportFirstSeen('guessNegation'), |
| 1709 | +guessDelay(Out) :- |
| 1710 | + reportFirstSeen('guessDelay'), |
| 1711 | + |
| 1712 | + % Remove each false or already committed to delay |
| 1713 | + forall(delay_queue(G, P, Commit), |
| 1714 | + ((not(G); |
| 1715 | + delay_goal(G, _); |
| 1716 | + delay_fail(G)) |
| 1717 | + -> (logdebugln('Removing outdated delay goal ~Q', [G]), |
| 1718 | + retract(delay_queue(G, P, Commit))) |
| 1719 | + ; true)), |
| 1720 | + |
| 1721 | + !, |
1691 | 1722 |
|
1692 |
| - %setof(P, negation_queue(_, P), Pset), |
1693 |
| - %max_list(Pset, Pmax), |
| 1723 | + setof(P, delay_queue(_, P, _), Pset), |
| 1724 | + max_list(Pset, Pmax), |
1694 | 1725 |
|
1695 | 1726 | % Sorting the queue takes a while. We should really use a priority queue...
|
1696 | 1727 | % but this hack works ok for now.
|
1697 |
| - member(Pmax, [0, -10, _]), |
| 1728 | + %member(Pmax, [0, -10, _]), |
1698 | 1729 |
|
1699 |
| - retract(negation_queue(G, Pmax)), |
1700 |
| - !, |
1701 |
| - (G, not(negation_commit(G)), not(negation_fail(G)) -> Out = tryOrNOTNegation(G); guessNegation(Out)). |
| 1730 | + setof((G, Pmax, Commit), |
| 1731 | + delay_queue(G, Pmax, Commit), |
| 1732 | + Gset), |
| 1733 | + |
| 1734 | + Out = tryBinarySearch(tryDelay, tryNOTDelay, Gset). |
1702 | 1735 |
|
1703 | 1736 | %% Local Variables:
|
1704 | 1737 | %% mode: prolog
|
|
0 commit comments