1

我正在使用 Datalog 教育系统 (DES),我想创建一个示例演绎数据库,该数据库递归地推导出组件的整体价值,该组件也可以具有子组件以及常规零件。如果不是因为我无法阻止递归和非递归子句的执行,它会工作得非常好。以下是造成问题的条款:

kop_as(A,B,C) :-
  assembly(A,C),
  sum(rek_as(A,D),D,B).

rek_as(A,B) :-
  a_s(A,C,Y),
  viena_as(A,D,_),
  rek_as(C,E),
  B=(D+E)*Y.

rek_as(A,B) :-
  viena_as(A,B,_).

在这种情况下,输出基本上翻了一番,因为第一个 rek_as 和第二个 rek_as 子句都被执行了。基本上我想做这样的事情:

kop_as(A,B,C) :-
  assembly(A,C),
  sum(rek_as(A,D),D,B).

rek_as(A,B) :-
  a_s(A,C,Y),
  viena_as(A,D,_),
  rek_as(C,E),
  B=(D+E)*Y,!.

rek_as(A,B) :-
  viena_as(A,B,_).

但这只是给我一个关于使用错误语法的编译错误。

4

1 回答 1

1

没关系,几分钟后我找到了解决方案。解决方案是根本不在递归子句中进行计算,并将所有数字运算留给非递归子句。

于 2016-04-18T23:06:29.490 回答