我有以下通过交换机连接街道的数据库:
例如
switch(r2,w52=s).
switch(w52=s,w53=d).
如何通过算法确定它,而不是通过数据库中的显式存款。?有什么建议么?
我有以下通过交换机连接街道的数据库:
例如
switch(r2,w52=s).
switch(w52=s,w53=d).
如何通过算法确定它,而不是通过数据库中的显式存款。?有什么建议么?
在 Prolog 中创建和查询动态生成的事实有多种选择。
基本的一种是使用元谓词,例如assert
and retract
。谓词在程序中添加和删除事实。例如,assert(switch(w52=s,w53=d))
将在您的程序中添加一个 switch 子句。您必须提前申报:- dynamic switch/2.
。使用 assert 的缺点是它不会回溯。也就是说,如果您在某个谓词中断言了某些事实并且它回溯,则该事实不会自动清除。
另一种选择是将这些事实累积在一个列表中,然后使用member/2
ormemberchk/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 将编译您的文件。