2016-08-28 10 views
-2

私はコースでプロローグを学んでいます。 this oneに似た質問がありましたが、同じ問題(すべての解決策が得られない)もありました。プロローグですべてのソリューションを生成

なぜ、どのような使い方が助けになるのですか? ありがとうございました

編集: 私が与えた練習では、可能なすべての最大独立セットをバイナリツリーから生成することです。 質問の2番目の部分では、私はすべてのミスを取得する必要がある整数のバイナリツリーを取得し、それらの数字を追加する上で最大を持つ必要があります。 つまり、私は1,3,9とミスしていて、1,3,4とミスしている場合は、1,3,9でミスします。

+1

あなたがしようとしていること、あなたのコードと入力と予想される出力を例にして説明してください。 「類似」という言葉は、問題をはっきりさせません。 – coder

+0

私はそれを更新しました。これがうまくいきたいです – Infested

答えて

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. 

あなたが1つのリストを返したい場合あなたが書くことができるソリューション:

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

misでmis_with_rootの後にカットを使うのはなぜ/どのように知っていましたか? – Infested

+0

まず、問題がmax_setでNi = N2だったので、必要なすべてのソリューション(List = List1; List = List2)を生成していましたが、List = List1の前にしか返しませんでした。 max_set述語のために私は置くことを試みた! before max_set(誤って_with_rootからケースを削除したくないため、確かに!mis_with_rootの後に行っていました)。 – coder

関連する問題