Самый глубокий узел дерева и расстояние - PullRequest
0 голосов
/ 10 октября 2018

У меня есть база знаний компонентов

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, а нефактическое расстояние между ними.

Оригинал КБ:

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).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...