我在课程中学习prolog。 我已经收到类似于this one的问题,我也遇到了同样的问题(它没有产生所有解决方案),
任何想法为什么,使用削减会有帮助吗? 提前谢谢
编辑: 我给出的练习是从二叉树生成所有可能的最大独立集。 在问题的第二部分,我得到一个整数二叉树,从中我需要得到所有的错误,并从那些我需要得到最大的一个添加其数字。 即如果我有1,3,9的错误和1,3,4的错误 - 我将返回1,3,9。
答案 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).