2017-04-12 6 views
1

私はleagalCourseという関数を書いています。当然のようには、例えば、john+mary+94は、コースデータは、それが持っていなければならないことを意味し、「法的」であれば、それはtrueあるべき94プロローグでコンストラクタとして演算子を使用

  • のマークとジョンとメアリーによって行わプロジェクトを表すことになりjohn+john+70のように同じ名前のプロジェクトを2回実行します。
  • 同じペアの生徒を含むリストに2つのプロジェクトがあってはいけません。したがって、リストにharry+ron+82というプロジェクトがある場合は、リストにharry+ron+90またはron+harry+63も含めることはできません。

    ?- legalCourse([one+two+3,four+five+6,one+six+7]). 
    true. 
    
    ?- legalCourse([one+two+3,four+four+6,one+six+7]). 
    false. 
    
    ?- legalCourse([one+two+3,four+five+6,one+two+7]). 
    false. 
    
    ?- legalCourse([one+two+3,two+one+6,one+six+7]). 
    false. 
    

    これは私が試したものです::

サンプル出力があり、私はsamePair述語を追加する前に

legalCourse([]). 
legalCourse(X) :- 
     diffName(X). 
legalCourse([Project|M]):- 
     diffName(Project), 
     not(samePair([Project|M])), 
     legalCourse(M). 

diffName(Name1+Name2+_) :- 
     Name1 \= Name2. 

/*can not have duplicated group*/ 
samePair([Name1+Name2+_|More]) :- 
     append([[head],tail,More]), 
     member(Name1,[head]), 
     member(Name2,[head]). 

機能が部分的に働きました。

答えて

2

私はこれがうまくいくと思います。あなたはvarsを切り替えて、check_no_dups/1の両方が異なるかチェックする必要があります。

legalCourse(List):- 
maplist(triple_double,List,ListDouble), 
check_no_dups(ListDouble). 

check_no_dups([]). 
check_no_dups([H|T]):- 
    H =X+Y, 
    maplist(dif(H),T), 
    H2 =Y+X, 
    maplist(dif(H2),T), 
    check_no_dups(T). 

triple_double(X+Y+_Z,X+Y):-dif(X,Y). 
+0

あなたはHとH2は必要ありませんが、私はそれを明確にしてくれると思います。 – user27815

+0

ありがとうございました!どのようにdif()が1つのvarでしか動作しないのだろうか?私はdif/2、dif/3 onlineしか見つけることができません、maplist(dif(H)、T)はTのすべての要素がHと等しくないことを意味しますか? – user3358850

+1

maplist(dif(H)、T)。 dif/2を使用しています。最初の引数をHに固定し、T iのすべての要素がmaplist(dif(1)、[a、b、c])と同じでないと言って、dif(1、a)、dif 、b)、dif(1、c)。対照的に、私がmaplist(dif、[1,2,3]、[a、b、c])を実行した場合、私は2つのリストを対にして比較します。すなわち、 dif(1、a)、dif(2、b)、dif(3、c)。 Ps。あなたの質問が解決された場合は、回答を受け入れたものとしてマークしてください。 – user27815

関連する問題