我正在编写一个名为leagalCourse
的函数,它只需要一个参数,一个课程列表。例如,john+mary+94
这样的课程将代表John和Mary完成的项目,标记为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.
这就是我的尝试:
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]).
在添加samePair谓词之前,该函数部分工作。
答案 0 :(得分: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).