2017-04-11 6 views
1

せずに別のリストにリストから要素を追加するこれは私のコードです:名1またはName2は非結合リストにすでにあるかどうかを確認されて行うことになっているものPrologは重複

students([], NameList). 
students([Name1+Name2+_|MoreProjects], [Name1,Name2|NameList]) :- 
    not_member(Name1, NameList), 
    not_member(Name2, NameList), 
    students(MoreProjects, NameList). 
students([Name1+Name2+_|MoreProjects], [Name1|NameList]) :- 
    not_member(Name1, NameList), 
    not(not_member(Name2, NameList)), 
    students(MoreProjects, NameList). 
students([Name1+Name2+_|MoreProjects], [Name2|NameList]) :- 
    not(not_member(Name1, NameList)), 
    not_member(Name2, NameList), 
    students(MoreProjects, NameList). 
students([Name1+Name2+_|MoreProjects], NameList) :- 
    not(not_member(Name1, NameList)), 
    not(not_member(Name2, NameList)), 
    students(MoreProjects, NameList). 

not_member(_, []). 
not_member(X, [Head|Tail]) :- 
     X \= Head, 
    not_member(X, Tail). 

、およびに追加します結果。

この正当なクエリ

students([ Dickens+Joyce+1, 
      Chekhov+Tolstoy+2, 
      Austen+Shakespeare+3, 
      Shirley+Byron+4 
     ], 
     StudentList). 

を実行すると、ちょうど私が偽与えます。コーディングをどのように調整すればよいですか?

答えて

1

ナムリストがインスタンス化されていないためネームリストでメンバーNameが1かどうかをテストできないため、ネゲーションを使用すると問題が発生するという問題があります。たとえば、試してみてください。

?- member(a,L). 
L = [a|_G6809] . 

それはLがあると仮定すると成功|それは部分的にLをインスタンス化して、[_G6809]が、今試してみてください。

?- \+member(a,L). 
false. 

をこれが失敗し、他の何もすることはできません。あなたはこれを何度も使ったことがあります:not(not_member(Name2, NameList))これはNameListがインスタンス化されていないので上記の例では失敗します。

修正するには、見つかったすべての要素を保存する別のList-アキュムレータが必要です。要素がメンバーであるかどうかを確認できるように、完全にインスタンス化されます。

students(L1,L2):-students(L1,L2,[]). 

students([], L, L). 
students([Name1+Name2+_|MoreProjects], NameList, L):- 
    not_member(Name1, L), 
    not_member(Name2, L), 
    students(MoreProjects, NameList,[Name1,Name2|L]). 

students([Name1+Name2+_|MoreProjects], NameList, L):- 
    not_member(Name1, L), 
    not(not_member(Name2, L)), 
    students(MoreProjects, NameList, [Name1|L]). 

students([Name1+Name2+_|MoreProjects], NameList, L):- 
    not(not_member(Name1, L)), 
    not_member(Name2, L), 
    students(MoreProjects, NameList, [Name2|L]). 

students([Name1+Name2+_|MoreProjects], NameList, L):- 
    not(not_member(Name1, L)), 
    not(not_member(Name2, L)), 
    students(MoreProjects, NameList, L). 

not_member(_, []). 
not_member(X, [Head|Tail]) :- 
     X \= Head, 
    not_member(X, Tail). 

上記の説明では、必要に応じてadd要素を空のリストとして指定しています。 生徒([「ディケンズ」+「ジョイス」+1、 「チェーホフを:あなたが照会する必要があるので、また

あなたが大文字で始まるどんなこと

students([ Dickens+Joyce+1, 
      Chekhov+Tolstoy+2, 
      Austen+Shakespeare+3, 
      Shirley+Byron+4 
     ], 
     StudentList). 

ノートを照会してみてくださいPrologの中の変数であります"+" Tolstoy "+2, " Austen "+" Shakespeare "+3、 " Shirley "+" Byron "+4 ]、 StudentList)。 これで試してみましょう:

students([ "Dickens"+"Joyce"+1,"Chekhov"+"Tolstoy"+2, "Auste"+"Shakespeare"+3,"Shirley"+"Byron"+4 ], StudentList). 
StudentList = ["Shirley", "Byron", "Auste", "Shakespeare", "Chekhov", "Tolstoy", "Dickens", "Joyce"] ; 
false. 

?- students([ "Dickens"+"Joyce"+1,"Byron"+"Tolstoy"+2, "Byron"+"Shakespeare"+3,"Byron"+"Byron"+4 ], StudentList). 
StudentList = ["Shakespeare", "Byron", "Tolstoy", "Dickens", "Joyce"] ; 
false.