1
votes

anyone of you could tell me how to turn off "Redefined static procedure" warnings? I red online documentation of swi-prolog and i found this predicate

 no_style_check(ultimate)
that in principle should turn off these warnings, but when i execute this predicate
main:-  
  no_style_check(singleton),
  no_style_check(discontiguous),
  no_style_check(multiple),
  require,
  test_all. 

i received this error

ERROR: Domain error: style_name' expected, foundmultiple'

Anyone knows an alternative way to do this or could tell me why i receive this error ?

Thanks in advance!

1
It would be better to mark the procedures you intend to redefine all over the place with :- dynamic my_proc/1. and :- discontiguous my_proc/1. than to disable this functionality, which can be a great help in debugging. I would strongly encourage you not to turn off singleton "warnings" because they are almost always in practice evidence of faulty coding.Daniel Lyons
Thanks for help! But i haven't understood the syntax of these predicates. Could you give me an example ?xeon88

1 Answers

3
votes

Prolog is a pretty loosey-goosey language, so by default it warns you when you do certain things that are not wrong per se, but tend to be a good indication that you've made a typo.

Now, suppose you write something like this:

myfoo(3, 3).
myfoo(N, M) :- M is N*4+1.

Then from the prompt you write this:

?- asserta(myfoo(7,9)).
ERROR: asserta/1: No permission to modify static procedure `myfoo/2'
ERROR: Defined at user://1:9

What's happening here is that you haven't told Prolog that it's OK for you to modify myfoo/2 so it is stopping you. The trick is to add a declaration:

:- dynamic myfoo/2.
myfoo(3, 3).
myfoo(N, M) :- M is N*4+1.

Now it will let you modify it just fine:

?- asserta(myfoo(7,9)).
true.

Now suppose you have three modules and they each advertise themselves by defining some predicate. For instance, you might have three files.

foo.pl

can_haz(foo).

bar.pl

can_haz(bar).

When you load them both you're going to get a warning:

?- [foo].
true.

?- [bar].
Warning: /home/fox/HOME/Projects/bar.pl:1:
        Redefined static procedure can_haz/1
        Previously defined at /home/fox/HOME/Projects/foo.pl:1
true.

And notice this:

?- can_haz(X).
X = bar.

The foo solution is gone.

The trick here is to tell Prolog that clauses of this predicate may be defined in different files. The trick is multifile:

foo.pl

:- multifile can_haz/1.
can_haz(foo).

bar.pl

:- multifile can_haz/1.
can_haz(bar).

In use:

?- [foo].
true.

?- [bar].
true.

?- can_haz(X).
X = foo ;
X = bar.

:- discontiguous does the same thing as multifile except in a single file; so you define clauses of the same predicate in different places in one file.

Again, singleton warnings are a completely different beast and I would absolutely not modify the warnings on them, they're too useful in debugging.