在prolog中生成所有解决方案

时间:2016-08-28 05:32:27

标签: prolog

我在课程中学习prolog。 我已经收到类似于this one的问题,我也遇到了同样的问题(它没有产生所有解决方案),

任何想法为什么,使用削减会有帮助吗? 提前谢谢

编辑: 我给出的练习是从二叉树生成所有可能的最大独立集。 在问题的第二部分,我得到一个整数二叉树,从中我需要得到所有的错误,并从那些我需要得到最大的一个添加其数字。 即如果我有1,3,9的错误和1,3,4的错误 - 我将返回1,3,9。

1 个答案:

答案 0 :(得分:1)

我从链接中改变了一点解决方案,所以它不完全是我的解决方案,只是纠正了代码,我认为现在它正常工作:

   mis(Tree, List, N) :-
    mis_no_root(Tree, List1, N1),       
    mis_with_root(Tree, List2, N2),!, 
    max_set(List1, N1, List2, N2, List, N). 


max_set(List1, N1, List2, N2, List, N) :-
    (N1>N2,List=List1,N=N1;              
     N2>N1,List=List2,N=N2;
    N2=:=N1,N=N1,(List=List1;List=List2)).              


mis_no_root(nil, [], 0).            
mis_no_root(t(L,_,R), List, N) :-
    mis(L, LeftList, LeftN),        
    mis(R, RightList, RightN),      
    append(LeftList, RightList, List),      
    N is LeftN + RightN.        


mis_with_root(nil, [], 0).          

mis_with_root(t(L,Root,R), [Root|List], N) :-
    mis_no_root(L, LeftList, LeftN),
    mis_no_root(R, RightList, RightN), 
    append(LeftList, RightList, List),      
    N is LeftN + RightN + 1. 

如果您想返回一个包含解决方案的列表,您可以写下:

final_mis(Tree,List,N):-findall(L,mis(Tree, L,_),List),List=[H|_],length(H,N).