]> Repositorios git - scryer-prolog.git/commitdiff
fail when retracting undefined dynamic predicates (#918)
authorMark Thom <[email protected]>
Sat, 1 May 2021 02:36:56 +0000 (20:36 -0600)
committerMark Thom <[email protected]>
Sat, 1 May 2021 02:36:56 +0000 (20:36 -0600)
src/lib/builtins.pl

index c95de3f5e9ce6b0d81ab7e694e159467e727bbbb..c08b4af96e04fc951c89cea62c14c4be834351ff 100644 (file)
@@ -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))