我计划通过使用断言根据现有事实制作新事实。但是,要制作的事实数量将超过 500 个,因此键入分号以进行更进一步的工作变得相当繁琐。因此我想忽略或传递“真实”(在 SWI PROLOG 中)
有什么办法可以解决这个问题吗?(例如,自动传递所有的'true's ...)
这是我的代码的一部分
%initialize
initialize :-
discipline(X,Y),
assert(result(X,0)).
我有太多的纪律(X,Y)..
我计划通过使用断言根据现有事实制作新事实。但是,要制作的事实数量将超过 500 个,因此键入分号以进行更进一步的工作变得相当繁琐。因此我想忽略或传递“真实”(在 SWI PROLOG 中)
有什么办法可以解决这个问题吗?(例如,自动传递所有的'true's ...)
这是我的代码的一部分
%initialize
initialize :-
discipline(X,Y),
assert(result(X,0)).
我有太多的纪律(X,Y)..
也许
?- forall(a_fact(F), your_fact_processing(F)).
在这种特定情况下forall
实际上是首选,但一般来说,在 Prolog 中,您必须依赖语言的机制来进行这种迭代。这是您的案例的示例:
initialize:-
discipline(X,Y),
assert(result(X,0)),
fail.
initialize.
在上面的这段代码中,您告诉解释器 initialize 应该通过回溯机制执行所有给定可能规则的“断言” 。除非您真正熟悉这一点,否则 Prolog 永远不会为您“点击”。
请注意,在此示例initialize
中永远不会失败,即使没有要断言的学科(因此没有结果)。您将需要一些额外的工作来检测这样的边缘情况——这就是为什么forall
对于断言许多事实的特定任务实际上是首选的原因。
另请注意,如果不声明单例变量是一种好习惯,则可以使用符号,其中不使用的变量以“_”(下划线)字符开头。