Recursion 使用Datalog教育系统(DES)时,是否可以创建类似于Prolog中感叹号的效果?

Recursion 使用Datalog教育系统(DES)时,是否可以创建类似于Prolog中感叹号的效果?,recursion,prolog,datalog,Recursion,Prolog,Datalog,我正在使用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.

我正在使用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,_).

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

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