这是我第一次使用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。我不明白原因。
如何使此谓词起作用?
答案 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),
...
,Xmonth
,Xyear
和Ymonth
变量编写必要的比较来完成代码吗?
答案 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)