使用 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,_).
但这只会给我一个关于使用错误语法的编译错误。
没关系,几分钟后我找到了解决方案。解决方案是根本不在递归子句中进行计算,而将所有数字处理留给非递归子句。
我正在使用 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,_).
但这只会给我一个关于使用错误语法的编译错误。
没关系,几分钟后我找到了解决方案。解决方案是根本不在递归子句中进行计算,而将所有数字处理留给非递归子句。