【问题标题】:use operator as constructor in prolog在 prolog 中使用运算符作为构造函数
【发布时间】:2017-04-12 04:21:14
【问题描述】:

我正在编写一个名为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 谓词之前,该函数部分工作。

【问题讨论】:

    标签: prolog


    【解决方案1】:

    我认为这可行,您需要切换变量并检查 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).
    

    【讨论】:

    • 你不需要 H 和 H2,但我把它们放进去,因为我认为这样更清楚。
    • 非常感谢先生!我想知道 diff( ) 如何只使用一个 var?我只能在网上找到dif/2,dif/3,maplist(dif(H),T)是不是意味着T中的每个元素都不能等于H?
    • 地图列表(差异(H),T)。正在使用差异/2。它将第一个参数固定为 H 并说 T 中的每个元素都不等于你所说的,即 maplist(dif(1),[a,b,c]),dif(1,a),dif(1 ,b),dif(1,c)。相反,如果我做了 maplist(dif,[1,2,3],[a,b,c]),那么我将成对比较两个列表。 IE。差(1,a),差(2,b),差(3,c)。附言。如果它解决了您的问题,请将答案标记为已接受。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-09
    • 2012-03-07
    • 2011-05-21
    • 1970-01-01
    • 2011-02-20
    • 2015-06-16
    • 2013-03-26
    相关资源
    最近更新 更多