你们中的任何人都可以告诉我如何关闭“重新定义的静态程序”警告? 我在swi-prolog的红色在线文档中找到了这个谓词
no_style_check(ultimate)原则上应该关闭这些警告,但是当我执行这个谓词时
main:- no_style_check(singleton), no_style_check(discontiguous), no_style_check(multiple), require, test_all.
我收到此错误
错误:域错误:
style_name' expected, found
倍'
任何人都知道另一种方法,或者告诉我为什么会收到此错误?
提前致谢!
答案 0 :(得分:3)
Prolog是一种非常松散的goosey语言,所以默认情况下,当你做某些不是错误的事情时,它会发出警告,但往往是一个很好的迹象表明你已经打错了。
现在,假设你写了这样的东西:
myfoo(3, 3).
myfoo(N, M) :- M is N*4+1.
然后从提示中写下:
?- asserta(myfoo(7,9)).
ERROR: asserta/1: No permission to modify static procedure `myfoo/2'
ERROR: Defined at user://1:9
这里发生的事情是,你没有告诉Prolog你可以修改myfoo/2
,这样就可以阻止你了。诀窍是添加一个声明:
:- dynamic myfoo/2.
myfoo(3, 3).
myfoo(N, M) :- M is N*4+1.
现在它可以让你修改它:
?- asserta(myfoo(7,9)).
true.
现在假设你有三个模块,它们每个都通过定义一些谓词来宣传自己。例如,您可能有三个文件。
<强> foo.pl 强>
can_haz(foo).
<强> bar.pl 强>
can_haz(bar).
当您加载它们时,您将收到警告:
?- [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.
请注意:
?- can_haz(X).
X = bar.
foo
解决方案消失了。
这里的技巧是告诉Prolog这个谓词的子句可以在不同的文件中定义。诀窍是multifile
:
<强> foo.pl 强>
:- multifile can_haz/1.
can_haz(foo).
<强> bar.pl 强>
:- multifile can_haz/1.
can_haz(bar).
使用中:
?- [foo].
true.
?- [bar].
true.
?- can_haz(X).
X = foo ;
X = bar.
除了单个文件外, :- discontiguous
与multifile的功能相同;因此,您可以在一个文件中的不同位置定义同一谓词的子句。
同样,单身警告是一个完全不同的野兽,我绝对不会修改它们上的警告,它们在调试中非常有用。