1
我正在寫一個名爲leagalCourse
的函數,它只需要一個參數即課程列表。一個療程等等,例如,john+mary+94
將是由約翰和瑪麗與94使用運算符作爲序言中的構造函數
- 標記做一個項目,它應該是
true
如果過程數據是「合法」的,這意味着它不能有同名項目兩次,如john+john+70
。 - 列表中也不能有兩個包含同一對學生的項目。因此,如果列表中有項目
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()如何才能使用一個var?我只能找到dif/2,dif/3在線,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(1 ,b)中,DIF(1,C)。相反,如果我做了maplist(dif,[1,2,3],[a,b,c]),那麼我會比較兩個明智的列表。即。 dif(1,a),dif(2,b),dif(3,c)。 PS。如果解決了您的問題,請將答案標記爲已接受。 – user27815