在PROLOG中,如何在不获得“true”结果的情况下递归使用assert?

时间:2013-12-10 16:18:46

标签: prolog prolog-assert

我打算使用断言基于现有事实制作新事实。 但是,要做的事实数量将超过500,因此输入分号进一步的步骤变得相当繁琐。 因此我想忽略或传递'true'(在SWI PROLOG中)

有没有办法解决这个问题?(例如,自动传递所有'真实的......)

这是我的代码的一部分

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

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

2 个答案:

答案 0 :(得分:1)

也许

?- forall(a_fact(F), your_fact_processing(F)).

答案 1 :(得分:-1)

在这个特定情况下forall is actually preferred,但一般来说,在Prolog中你必须依赖语言的机制进行这种迭代。以下是您的案例示例:

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

在上面的这段代码中,您告诉解释器初始化应该通过backtracking mechanism执行所有“断言”给定可能的规则。 除非您对此非常熟悉,否则Prolog永远不会为您“点击”。

请注意,在此示例中initialize永远不会失败,即使没有规则(因此也没有结果)断言。你需要一些额外的工作来检测像这样的边缘情况 - 这就是为什么forall实际上更适合这个断言许多事实的特定任务的原因。

另请注意,如果最好不要声明单例变量,则可以使用不使用的变量以“_”(下划线)字符开头的符号。