[英]Prolog predicate that compares values in facts
這是我第一次使用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.
但這總是返回false。 我不明白原因。
如何使該謂詞起作用?
在Prolog中,變量以下划線或大寫字母開頭。 例如, firstname
是一個原子 ,即一個常數,但是FirstName
是一個變量 。 但是,在您的特定問題中,您無需關心員工姓名。 因此,您可以將這些參數替換為匿名變量:
senior(X,Y) : -
employee(X, _, _, Xmonth, Xyear),
employee(Y, _, _, Ymonth, Yyear),
...
您現在可以通過使用Xmonth
, Xyear
, Ymonth
和Yyear
變量編寫必要的比較來完成代碼嗎?
用一條規則來執行此操作是強制性的嗎? 您可以使用一個規則比較不同年份的雇員,使用第二個規則比較相同年份的雇員。 為了對此進行擴展,假設您以這種方式列出了員工:
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.
確保您不要忘記並用下划線代替“ Year”和/或“ Month”,因為這樣,在2010-01-01(ISO 8601)雇用的人員將比在2005-12-12雇用的人員顯示為高級。
再說一次,也許您應該在ISO 8601:2004中對所有日期進行分類。 無論您的員工人數多大,都可以編寫一個小的腳本進行轉換
employee(eID,firstname,lastname,month,year)
至
employee(eID,firstname,lastname,yyyymm)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.