Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows Prolog数据库规则_Windows_Prolog - Fatal编程技术网

Windows Prolog数据库规则

Windows Prolog数据库规则,windows,prolog,Windows,Prolog,我有两个关于Prolog编程的问题 我有一个如下所示的数据库: message(bob,kelly). message(patrick,ann). 数据库继续使用此格式。因此,我的问题是在SWI Prolog中,如何在数据库打开时编写规则并保存它,以确定bob是否发送或接收任何消息 另一个是写一个规则,看看两个人是否在他们之间发送或接收消息。我知道怎么做,但使用SWI Prolog确实很混乱 感谢所有的帮助 我想你已经被Prolog中“数据库”的概念弄糊涂了。“关系数据库”通常被理解为RDBM

我有两个关于Prolog编程的问题

我有一个如下所示的数据库:

message(bob,kelly).
message(patrick,ann).
数据库继续使用此格式。因此,我的问题是在SWI Prolog中,如何在数据库打开时编写规则并保存它,以确定bob是否发送或接收任何消息

另一个是写一个规则,看看两个人是否在他们之间发送或接收消息。我知道怎么做,但使用SWI Prolog确实很混乱


感谢所有的帮助

我想你已经被Prolog中“数据库”的概念弄糊涂了。“关系数据库”通常被理解为RDBMS,它是关系数据库管理系统的首字母缩写。Prolog为您提供了一个关系数据库,但它本身并不是一个数据库管理系统

Prolog不会“打开数据库”,而是“查阅文件”。当您执行
[foo]
操作时,它只会打开
foo.pl
,将内容解析到内存中,然后关闭文件。文件不会保持“打开”状态。如果对源自该文件的事实执行
asserta/1
retract/1
,则更改会发生在内存中,但Prolog不知道或不关心这些更改是否来自该文件,并且Prolog不会在文件更改后神奇地重新生成该文件,也不会将新文件写入磁盘

如果您想让Prolog知道Bob向Kelly发送了一条消息,您必须声明它。如果您希望该文件在此之后保持最新,则必须打开该文件并将数据写入其中。更重要的是,也许您必须了解,如果您运行多个序言,它们不会以某种方式连接并共享单个数据库。它们都将在内存存储中独立运行。这意味着,如果您确实不辞辛劳地使更改持久化,则必须确保只有一个进程使用该文件。如果您有多个,它们会互相践踏对方的更改。

(1)将
消息
语句放入文件中,(2)运行prolog环境并包含该文件,(3)输入查询,例如
消息(bob,X)。
您将看到prolog将为您提供数据中指示的
X
值。