2017-04-12 43 views
1

我正在寫一個名爲leagalCourse的函數,它只需要一個參數即課程列表。一個療程等等,例如,john+mary+94將是由約翰和瑪麗與94使用運算符作爲序言中的構造函數

  • 標記做一個項目,它應該是true如果過程數據是「合法」的,這意味着它不能有同名項目兩次,如john+john+70
  • 列表中也不能有兩個包含同一對學生的項目。因此,如果列表中有項目harry+ron+82,則列表中也包含harry+ron+90ron+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

我認爲這個工作,你需要切換變量和檢查兩個不同的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()如何才能使用一個var?我只能找到dif/2,dif/3在線,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(1 ,b)中,DIF(1,C)。相反,如果我做了maplist(dif,[1,2,3],[a,b,c]),那麼我會比較兩個明智的列表。即。 dif(1,a),dif(2,b),dif(3,c)。 PS。如果解決了您的問題,請將答案標記爲已接受。 – user27815

相關問題