Max Independent Set in Prolog

北慕城南 提交于 2019-12-25 04:28:01

问题


I am trying to implement a Prolog predicate that gets a binary tree (represented as t(Left, Root, Right)) and returns a list that is the Maximal Independent Set (MIS) of this tree, and its size. I first understood that MIS(T) is the maximum between the MIS with root and the MIS without the root. Then, I used two theorems, stating that the MIS with root is the unification of the MIS's without the root for all the subtrees, and that MIS without root is the unification of the MIS's of all the subtrees.

% mis is a predicate for finding the Max Independent Set (MIS) in a binary tree. 
% It has three arguments: one is input - a binary tree T - and the other two are output - List which is a list of elements in the max independent set of tree T, with N being the number of elements in this set.
mis(Tree, List, N) :-
    mis_no_root(Tree, List1, N1),       % find mis without root
    mis_with_root(Tree, List2, N2), % find mis with root
    max_set(List1, N1, List2, N2, List, N). % choose the bigger set of nodes

% This is a helping predicate, that gets lists List1 and List2 of lengths N1 and N2 respectively, and instantiates List to be the bigger list, with N being its size
max_set(List1, N1, _, N2, List, N) :-
    N1>=N2,             % if N1 is bigger or equal
    List=List1,         % then max set is List1
    N=N1.               % of length N1

max_set(_, N1, List2, N2, List, N) :-
    N2>N1,              % if N2 is bigger
    List=List2,         % then max set is List2
    N=N2.               % of length N2

% a helping predicate to find the max independent set of t(L,_,R), excluding the root
mis_no_root(nil, [], 0).            % the empty subtree has an empty max independent set of size 0

mis_no_root(t(L,_,R), List, N) :-
    mis(L, LeftList, LeftN),        % calculate mis of left subtree 
    mis(R, RightList, RightN),      % calculate mis of right subtree
    conc(LeftList, RightList, List),        % concatenate lists of nodes according to the given formula (unification of all mis of subtrees)
    N is LeftN + RightN.        % and assign N with the accumulated size of the concatenated independent set, without adding something for the root.

% a helping predicate to find the max independent set of t(L,X,R), including the root
mis_with_root(nil, [], 0).          % the empty subtree has an empty max independent set of size 0

mis_with_root(t(L,Root,R), [Root|List], N) :-
    mis_no_root(L, LeftList, LeftN),    % calculate mis of left subtree without root
    mis_no_root(R, RightList, RightN),  % calculate mis of right subtree without root
    conc(LeftList, RightList, List),        % concatenate lists of nodes according to the given formula (unification of all mis_no_root of subtrees)
    N is LeftN + RightN + 1.        % and assign N with the accumulated size of the concatenated independent set, incremented by 1 (including the root).

It does succeed retrieving a set of maximal size, but it does NOT continue searching for other MIS's of the same size. Thanks in advance for any help!


回答1:


Don't get mad when you see what the annoying issue was! just add = on the second max_set (N2>=N1). :)



来源:https://stackoverflow.com/questions/38413957/max-independent-set-in-prolog

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!