比较事实值的Prolog谓词

时间:2018-12-18 11:14:10

标签: prolog

这是我第一次使用Prolog

我有员工

Button

示例:

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

我想创建一个谓词employee(1,liz,white,4,2000). employee(2,ted,johnson,5,1998). ,如果第一位员工在公司中年纪较大,则该谓词将返回true。

我有这个:

senior(X,Y)

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

如何使此谓词起作用?

2 个答案:

答案 0 :(得分:1)

在Prolog中,变量以下划线或大写字母开头。例如。 from category in categories where category.ID == 1 // <------ above join join prod in products on category.ID equals prod.CategoryID select new { Category = category.Name, Product = prod.Name }; atom ,即常量,而firstname variable 。但是,在您的特定问题中,您无需关心员工姓名。因此,您可以将这些参数替换为 anonymous 变量:

FirstName

您现在可以使用senior(X,Y) : - employee(X, _, _, Xmonth, Xyear), employee(Y, _, _, Ymonth, Yyear), ... XmonthXyearYmonth变量编写必要的比较来完成代码吗?

答案 1 :(得分: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)