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

时间:2016-04-18 22:33:38

标签: recursion prolog 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,_).

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

1 个答案:

答案 0 :(得分:1)

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