1

我计划通过使用断言根据现有事实制作新事实。但是,要制作的事实数量将超过 500 个,因此键入分号以进行更进一步的工作变得相当繁琐。因此我想忽略或传递“真实”(在 SWI PROLOG 中)

有什么办法可以解决这个问题吗?(例如,自动传递所有的'true's ...)

这是我的代码的一部分

%initialize
initialize :-
   discipline(X,Y),
   assert(result(X,0)).

我有太多的纪律(X,Y)..

4

2 回答 2

1

也许

?- forall(a_fact(F), your_fact_processing(F)).
于 2013-12-10T16:35:03.687 回答
-1

在这种特定情况下forall实际上是首选,但一般来说,在 Prolog 中,您必须依赖语言的机制来进行这种迭代。这是您的案例的示例:

initialize:- 
   discipline(X,Y),
   assert(result(X,0)),
   fail.
initialize.

在上面的这段代码中,您告诉解释器 initialize 应该通过回溯机制执行所有给定可能规则的“断言” 。除非您真正熟悉这一点,否则 Prolog 永远不会为您“点击”。

请注意,在此示例initialize中永远不会失败,即使没有要断言的学科(因此没有结果)。您将需要一些额外的工作来检测这样的边缘情况——这就是为什么forall对于断言许多事实的特定任务实际上是首选的原因。

另请注意,如果不声明单例变量是一种好习惯,则可以使用符号,其中不使用的变量以“_”(下划线)字符开头。

于 2014-11-08T20:15:12.943 回答