我处理一个问题;我想计算我的代码的递归规则做了多少次递归。
我的程序检查对象是否是计算机硬件的组件(通过组件(X,Y)谓词)。例如组件(计算机,主板)-> true。
它甚至检查对象不是直接组件而是另一个组件的子组件的情况。例如 subcomponent(computer,ram) -> true。(因为 ram 是主板的组件,主板是计算机的组件)
因为我的代码超过 400 行,所以我将只向您展示表单组件(X,Y)和规则子组件(X,Y)的一些谓词。
因此,一些谓词如下:
component(computer,case).
component(computer,power_supply).
component(computer,motherboard).
component(computer,storage_devices).
component(computer,expansion_cards).
component(case,buttons).
component(case,fans).
component(case,ribbon_cables).
component(case,cables).
component(motherboard,cpu).
component(motherboard,chipset).
component(motherboard,ram).
component(motherboard,rom).
component(motherboard,heat_sink).
component(cpu,chip_carrier).
component(cpu,signal_pins).
component(cpu,control_pins).
component(cpu,voltage_pins).
component(cpu,capacitors).
component(cpu,resistors).
等等....
我的规则是:
subcomponent(X,Z):- component(X,Z).
subcomponent(X,Z):- component(X,Y),subcomponent(Y,Z).
好吧,为了计算给定组件 X 到给定组件 Y 所具有的组件数量——也就是递归规则 subcomponents(X,Y) 的递归数量,我做了一些失败的尝试。但是,我在下面介绍它们:
一世)
number_of_components(X,Y,N,T):- T is N+1, subcomponent(X,Y).
number_of_components(X,Y,N,T):- M is N+1, subcomponent(X,Z), number_of_components(Z,Y,M,T).
在这种情况下,我收到此错误:“错误:is/2:参数未充分实例化”。
ii)
number_of_components(X,Y):- bagof(Y,subcomponent(X,Y),L),
length(L,N),
write(N).
在这种情况下,我得到的结果是 1 或 11,并且在这个数字之后是真的,仅此而已。完全没有逻辑!
iii)
count_elems_acc([], Total, Total).
count_elems_acc([Head|Tail], Sum, Total) :-
Count is Sum + 1,
count_elems_acc(Tail, Count, Total).
number_of_components(X,Y):- bagof(Y,subcomponent(X,Y),L),
count_elems_acc(L,0,Total),
write(Total).
在这种情况下,根据我的知识库,我得到的结果数字不正确。(或者我误译了它们——因为这种方式似乎有一些逻辑)
那么,我做错了什么,我应该写什么?
我期待着阅读你的答案!