【问题标题】:Prolog predicate that compares values in facts比较事实值的 Prolog 谓词
【发布时间】:2018-12-27 22:33:35
【问题描述】:

这是我第一次使用 Prolog

我有员工

employee(eID,firstname,lastname,month,year) 

例子:

employee(1,liz,white,4,2000).
employee(2,ted,johnson,5,1998).

我想创建一个谓词 senior(X,Y),如果公司中的第一个员工年龄较大,它将返回 true。

我有这个:

senior(X,Y) : -
  employee(X,firstname,lastname,month,year),
  employee(Y,firstname,lastname,month,year),
  X.year < Y.year.

但这总是返回假。我不明白原因。

我怎样才能使这个谓词起作用?

【问题讨论】:

  • 这不是经营公司的方式,在欧洲也是非法的。您不得按年龄歧视,除非有正当理由(例如,法律限制未满年龄的人的工作时间)。
  • 大声笑,顺便说一句,这是员工雇用的日期!
  • 如果您的意思是员工被雇用的日期,那么它就不那么狡猾了。但是,我仍然看不到像这样比较人有什么价值。一个人可能在公司工作了几个星期,但在某项工作上比在公司工作了 10 年的人要好得多。

标签: prolog


【解决方案1】:

您是否必须使用一条规则来执行此操作?您可以使用一条规则来比较不同年份雇用的员工,并使用第二条规则来比较同一年雇用的员工。为了扩展这一点,假设您有这样列出的员工:

employee(eid,year,month,day)

当然还有员工名单。您可以使用以下三个规则:

% For employees that were hired in different years.
senior(Eid1,Eid2) :-
    employee(Eid1,X,_,_),
    employee(Eid2,Y,_,_),
    X<Y.

% For employees that were hired in the same year, different month.
senior(Eid1,Eid2) :-
    employee(Eid1,Year,X,_);
    employee(Eid2,Year,Y,_);    % Notice how one common variable "Year" is used
    X<Y.

% For employees that were hired in the same year, same month, different day,
% the rule is "expanded" from the previous one.
senior(Eid1,Eid2) :-
    employee(Eid1,Year,Month,X);
    employee(Eid2,Year,Month,Y);
    X<Y.

确保您不要忘记并将“年”和/或“月”替换为下划线,因为这样会显示在 2010-01-01 (ISO 8601) 雇用的人为高级给在2005-12-12雇用的人。

再一次,也许您应该将所有日期编入ISO 8601:2004。不管你的员工名单有多大,你都可以写一个小脚本来转换

employee(eID,firstname,lastname,month,year)

employee(eID,firstname,lastname,yyyymm)

【讨论】:

    【解决方案2】:

    在 Prolog 中,变量以下划线或大写字母开头。例如。 firstname 是一个原子,即一个常数,但FirstName 是一个变量。但是,在您的具体问题中,您并不关心员工姓名。因此,您可以用 anonymous 变量替换这些参数:

    senior(X,Y) : -
      employee(X, _, _, Xmonth, Xyear),
      employee(Y, _, _, Ymonth, Yyear),
      ...
    

    您现在可以通过使用XmonthXyearYmonthYyear 变量编写必要的比较来完成代码吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多