最深的树节点和距离

时间:2018-10-10 14:12:10

标签: prolog

我具有组件的知识库

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).

0 个答案:

没有答案