我正潜入prolog的世界,但我似乎遇到了浅水!
我正在研究prolog中关于本教程的数据库操作:Learn Prolog Now!
它声明我可以通过输入listing
所以我尝试了它,它基本上应该输出我的.P文件中的所有内容(事实,规则),但这就是我得到的,这是我的命令序列:
? consult('D:\Prolog\testfile.P').
[testfile.P loaded]
? listing.
library_directory(C:blahblahpathtoXSB)
library_directory(C:blahblahXSBpath)
{this is listed around 5 times)}
根据教程,这个命令不应该显示testfile.P中的内容吗?
在咨询testfile.P后我应该能够使用assert
添加更多的事实,但它实际上并没有改变testfile.P中的任何内容。
任何想法
答案 0 :(得分:2)
列表谓词的行为因Prolog解释器而异。 XSB documentation解释了列表/ 0的输出中包含的代码:
请注意,列表/ 0不会列出任何内容 编译谓词,除非他们有 动态属性(见谓词 属性/ 2)。一个谓词得到了 显式时的动态属性 声明为动态或自动 在某些条款中获得它 谓词在断言中断言 数据库中。
使用一个非常简单的test.P文件包含:
test(a,b).
这里使用XSB中的listing / 0,同时包含参考文件和断言规则。它只输出动态断言的规则,而不是文件的内容:
| ?- consult('test.P').
[test loaded]
yes
| ?- listing.
library_directory(/home/jeffd/xsb/XSB/packages).
library_directory(/home/jeffd/xsb/XSB/site/lib).
library_directory(/home/jeffd/xsb/XSB/site/config/i686-pc-linux-gnu/lib).
library_directory(/home/jeffd/xsb/XSB/config/i686-pc-linux-gnu/lib).
library_directory(/home/jeffd/.xsb/config/i686-pc-linux-gnu).
yes
| ?- assert(testing(c,d)).
yes
| ?- listing.
testing(c,d).
library_directory(/home/jeffd/xsb/XSB/packages).
library_directory(/home/jeffd/xsb/XSB/site/lib).
library_directory(/home/jeffd/xsb/XSB/site/config/i686-pc-linux-gnu/lib).
library_directory(/home/jeffd/xsb/XSB/config/i686-pc-linux-gnu/lib).
library_directory(/home/jeffd/.xsb/config/i686-pc-linux-gnu).
SWI-Prolog的行为方式现在学习Prolog现在描述并输出两个文件的内容和动态添加的规则:
?- consult('test.P').
% test.P compiled 0.00 sec, 1,192 bytes
true.
?- assert(testing(c,d)).
true.
?- listing.
test(a, b).
% Foreign: rl_read_history/1
:- dynamic testing/2.
testing(c, d).
% Foreign: rl_write_history/1
% Foreign: rl_add_history/1
% Foreign: rl_read_init_file/1
true.