在prolog

时间:2016-02-19 17:57:40

标签: prolog swi-prolog

你们中的任何人都可以告诉我如何关闭“重新定义的静态程序”警告? 我在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倍'

任何人都知道另一种方法,或者告诉我为什么会收到此错误?

提前致谢!

1 个答案:

答案 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的功能相同;因此,您可以在一个文件中的不同位置定义同一谓词的子句。

同样,单身警告是一个完全不同的野兽,我绝对不会修改它们上的警告,它们在调试中非常有用。