在prolog中使用operator作为构造函数

时间:2017-04-12 04:21:15

标签: prolog

我正在编写一个名为leagalCourse的函数,它只需要一个参数,一个课程列表。例如,john+mary+94这样的课程将代表John和Mary完成的项目,标记为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.

这就是我的尝试:

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谓词之前,该函数部分工作。

1 个答案:

答案 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).