如何将Prolog数据库更改为动态数据库?

时间:2013-01-19 10:54:11

标签: prolog

我有以下数据库通过交换机连接街道:

例如

switch(r2,w52=s).
switch(w52=s,w53=d).

如何通过算法确定,而不是通过数据库中的显式存款来确定。 有什么建议吗?

1 个答案:

答案 0 :(得分:0)

您可以使用多种方法在Prolog中创建和查阅动态生成的事实。

基本的一个是使用元谓词,例如assertretract。谓词添加和删除程序中的事实。例如,assert(switch(w52=s,w53=d))将为您的程序添加一个switch子句。您必须提前声明:- dynamic switch/2.。使用assert的缺点是它不会回溯。也就是说,如果你在某个谓词中声明了一些事实并且它已经回溯,那么事实就不会自动清理。

另一种选择是在列表中累积这些事实,然后使用member/2memberchk/2检查给定事实是否在该列表中,而不是查询程序。 E.g:

L = [switch(w52=s,w53=d), switch(w53=d,w54=d), ...]
member(switch(w53=A, w54=B), L) % Unifies A=d, B=d

与使用断言不同,此方法可以像任何其他Prolog谓词一样工作。

最后,您可以运行两阶段程序。在第一阶段,将您计算的条款打印到文件,并希望用作事实。这很简单,因为Prolog支持编写完整的术语,无需自己格式化。然后只需查阅该文件。如果您经常阅读事实而不是生成它们,这是最有效的方法,因为Prolog会编译您的文件。