Daniel@0: /* Part of DML (Digital Music Laboratory) Daniel@0: Copyright 2014-2015 Samer Abdallah, University of London Daniel@0: Daniel@0: This program is free software; you can redistribute it and/or Daniel@0: modify it under the terms of the GNU General Public License Daniel@0: as published by the Free Software Foundation; either version 2 Daniel@0: of the License, or (at your option) any later version. Daniel@0: Daniel@0: This program is distributed in the hope that it will be useful, Daniel@0: but WITHOUT ANY WARRANTY; without even the implied warranty of Daniel@0: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Daniel@0: GNU General Public License for more details. Daniel@0: Daniel@0: You should have received a copy of the GNU General Public Daniel@0: License along with this library; if not, write to the Free Software Daniel@0: Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Daniel@0: */ Daniel@0: Daniel@0: :- module(insist, [insist/1,insist/2, insist/3]). Daniel@0: :- meta_predicate insist(0,:), insist(0), insist(+,0,:). Daniel@0: Daniel@0: insist(G) :- insist(G,failed(G)). Daniel@0: insist(G,Ex) :- call(G) -> true; throw(Ex). Daniel@0: insist(det,G,Ex) :- insist(G,Ex). Daniel@0: insist(multi,G,Ex) :- call(G) *-> true; throw(Ex). Daniel@0: Daniel@0: user:goal_expansion(insist(G),X) :- user:goal_expansion(insist(G,failed(G)),X). Daniel@0: user:goal_expansion(insist(G,Ex),(G->true;throw(Ex))). Daniel@0: user:goal_expansion(insist(det,G,Ex),X) :- user:goal_expansion(insist(G,Ex),X). Daniel@0: user:goal_expansion(insist(multi,G,Ex),(G*->true;throw(Ex))).