0

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

例如

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

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

4

1 回答 1

0

在 Prolog 中创建和查询动态生成的事实有多种选择。

基本的一种是使用元谓词,例如assertand retract。谓词在程序中添加和删除事实。例如,assert(switch(w52=s,w53=d))将在您的程序中添加一个 switch 子句。您必须提前申报:- dynamic switch/2.。使用 assert 的缺点是它不会回溯。也就是说,如果您在某个谓词中断言了某些事实并且它回溯,则该事实不会自动清除。

另一种选择是将这些事实累积在一个列表中,然后使用member/2ormemberchk/2来检查给定的事实是否在该列表中,而不是查询程序。例如:

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 将编译您的文件。

于 2013-01-20T12:26:29.467 回答