我正在使用 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,_).
但这只是给我一个关于使用错误语法的编译错误。