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

When working with Datalog Educational System (DES), is it possible to create a similar effect to the exclamation mark in 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,_).

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

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