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]).
機能が部分的に働きました。
あなたはHとH2は必要ありませんが、私はそれを明確にしてくれると思います。 – user27815
ありがとうございました!どのようにdif()が1つのvarでしか動作しないのだろうか?私はdif/2、dif/3 onlineしか見つけることができません、maplist(dif(H)、T)はTのすべての要素がHと等しくないことを意味しますか? – user3358850
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