:- lib(mod_goal/2).
/** holds( +Goal, -Holds ).
Goal is called deterministically with =|Holds = true|= iff Goal
succeeds. Else, =|Holds = false|=.
Note that if Holds is instantiated, Goal will still be called,
with holds/2 succeeding iff Holds corresponds to the right outcome from Goal.
==
?- holds( X=3, Holds ).
X = 3,
Holds = true.
?- holds( 4=3, Holds ).
Holds = false.
?- holds( member(X,[a,b]), Holds ).
X = a,
Holds = true.
?- holds( member(X,[a,b]), non_true ).
false.
?- holds( (write(x),nl), non_true ).
x
false.
?- holds( member(X,[a,b]), false ).
false.
==
@author nicos angelopoulos
@version 0.1 2015/12/9
@version 0.2 2017/9/25, added mod_goal/2
*/
holds( Goal, Holds ) :-
mod_goal( Goal, Moal ),
call( Moal ),
!,
Holds = true.
holds( _Goal, false ).