我具有组件的知识库
component(ElementX,ElementY,Qty).
ElementX uses ElementY in it's structure in quantity Qty.
component(bicycle, wheel, 2).
component(bicycle, braking_system, 1).
component(bicycle, transmission_system, 1).
component(wheel, tire, 1).
component(wheel, valve, 1).
component(braking_system, right_brake, 1).
component(braking_system, left_brake, 1).
component(transmission_system, chain, 1).
component(transmission_system, gears_front, 1).
component(transmission_system, gears_back, 1).
component(gears_back, abc, 1).
component(chain, bcd, 1).
我必须在我认为是二叉树的地方找到2个最深的节点。
我首先找到1,然后将解决方案调整为2,这就是我编写的代码。
% calculate distance between 2 nodes
level(P1,P2,Num):- dfs(P1,P2,[],L),length(L,Num2), Num is Num2 - 1.
dfs(X,X,T,L) :- reverse([X|T],L).
dfs(X,Z,T,L) :- (component(X,Y,_);component(Y,X,_)),not(member(X,T)),dfs(Y,Z,[X|T],L).
% Find the max of 2 values
max( X, Y, Max) :-
X >= Y, !, Max = X
;
Max = Y.
% list all leaf nodes
find_leaves(Results):-
setof(X, Y^N^(component(Y, X, N), \+component(X, _, _)), Results).
% Calculate the distance between root node and all leaf nodes
calc_dist(_, [], []).
calc_dist(Element, [H | T], [N | T2]):-
level(Element, H, N),
calc_dist(Element, T, T2).
% find max of a list
maxlist([X], X).
maxlist([X, Y | Rest], Max):-
maxlist([Y | Rest], MaxRest),
max(X, MaxRest, Max).
% start at Root, calculate all the distances, find the max
%and element at same index in Leaves
two_deepest(Root, (EMax1, Depth1)):-
find_leaves(Leaves),
calc_dist(Root, Leaves, Distances),
maxlist(Distances, Depth1),
nth1(Index, Distances, Depth1),
nth0(Index, Leaves, EMax1).
但是,这似乎返回的距离要比知识库中找到的任何距离都大,并且在此之上似乎是一种非常复杂的方法。
还有另一种方法吗?任何帮助将不胜感激。
编辑:
纯粹为了测试,我添加了两个组件
component(gears_back, abc, 1).
component(chain, bcd, 1).
在这种情况下打电话
two_deepest(bicycle, (EMax1, Depth1)).
应该返回(我认为):
EMax1 = bcd,
Depth1 = 3 ;
EMax1 = abc,
Depth1 = 3 ;
但是我得到的是:
EMax1 = bcd,
Depth1 = 3 ;
EMax1 = gears_front,
Depth1 = 3 ;
我想在这一点上我得到的是dfs采取的步骤,而不是它们之间的实际距离。
原始KB:
component(bicicleta,quadro,1).
component(bicicleta,roda,2).
component(bicicleta,conjunto_travagem,1).
component(bicicleta,conjunto_transmissao,1).
component(bicicleta,conjunto_selim,1).
component(bicicleta,direccao,1).
component(quadro,tubo_superior,1).
component(quadro,tubo_diagonal,1).
component(quadro,tubo_selim,1).
component(quadro,escora_diagonal,1).
component(quadro,escora_horizontal,1).
component(quadro,forqueta_frontal,1).
component(roda,pneu,1).
component(roda,aro,1).
component(roda,valvula,1).
component(roda,cubo,1).
component(roda,aperto_rapido,1).
component(roda,raio,30).
component(conjunto_travagem,travao_direito,1).
component(conjunto_travagem,travao_esquerdo,1).
component(travao_esquerdo,manete,1).
component(travao_esquerdo,cabo,1).
component(travao_esquerdo,bicha,1).
component(travao_esquerdo,disco,1).
component(travao_esquerdo,pastilha,2).
component(travao_direito,manete,1).
component(travao_direito,cabo,1).
component(travao_direito,bicha,1).
component(travao_direito,disco,1).
component(travao_direito,pastilha,2).
component(conjunto_transmissao,pedaleiro,1).
component(pedaleiro,pedal,1).
component(pedaleiro,braco_pedal,1).
component(pedaleiro,rolamento,1).
component(pedaleiro,prato,1).
component(conjunto_transmissao,corrente,1).
component(conjunto_transmissao,desviador_traseiro,1).
component(conjunto_transmissao,desviador_dianteiro,1).
component(conjunto_transmissao,cassete,1).
component(conjunto_transmissao,mudancas_dianteira,1).
component(mudancas_dianteira,manete_dianteira,1).
component(mudancas_dianteira,bicha,1).
component(mudancas_dianteira,cabo,1).
component(conjunto_transmissao,mudancas_traseira,1).
component(mudancas_traseira,manete_traseira,1).
component(mudancas_traseira,bicha,1).
component(mudancas_traseira,cabo,1).
component(conjunto_selim,selim,1).
component(conjunto_selim,espigao,1).
component(conjunto_selim,aperto_rapido_selim,1).
component(direccao,caixa_direccao,1).
component(direccao,guiador,1).
component(direccao,avanco_guiador,1).