From: Mark Thom Date: Sat, 1 May 2021 02:36:56 +0000 (-0600) Subject: fail when retracting undefined dynamic predicates (#918) X-Git-Tag: v0.9.0~95 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=d8bd4fbea6fb97e69d33f9f7ce012daa2306e6fd;p=scryer-prolog.git fail when retracting undefined dynamic predicates (#918) --- diff --git a/src/lib/builtins.pl b/src/lib/builtins.pl index c95de3f5..c08b4af9 100644 --- a/src/lib/builtins.pl +++ b/src/lib/builtins.pl @@ -847,7 +847,7 @@ asserta_clause(Head, Body) :- asserta(Clause) :- ( Clause \= (_ :- _) -> Head = Clause, - Body = user:true, + Body = true, asserta_clause(Head, Body) ; Clause = (Head :- Body) -> asserta_clause(Head, Body) @@ -897,7 +897,7 @@ assertz_clause(Head, Body) :- assertz(Clause) :- ( Clause \= (_ :- _) -> Head = Clause, - Body = user:true, + Body = true, assertz_clause(Head, Body) ; Clause = (Head :- Body) -> assertz_clause(Head, Body) @@ -926,7 +926,9 @@ retract_module_clause(Head, Body, Module) :- ( var(Head) -> throw(error(instantiation_error, retract/1)) ; callable(Head), functor(Head, Name, Arity) -> - ( '$head_is_dynamic'(Module, Head) -> + ( '$no_such_predicate'(Module, Head) -> + '$fail' + ; '$head_is_dynamic'(Module, Head) -> ( Module == user -> call_retract(Head, Body, Name, Arity) ; call_module_retract(Head, Body, Name, Arity, Module) @@ -970,10 +972,10 @@ retract_clause(Head, Body) :- arg(1, Head, Module), arg(2, Head, F), retract_module_clause(F, Body, Module) - ; '$head_is_dynamic'(user, Head) -> - call_retract(Head, Body, Name, Arity) ; '$no_such_predicate'(user, Head) -> '$fail' + ; '$head_is_dynamic'(user, Head) -> + call_retract(Head, Body, Name, Arity) ; throw(error(permission_error(modify, static_procedure, Name/Arity), retract/1)) ) ; throw(error(type_error(callable, Head), retract/1))