簡體   English   中英

比較事實值的Prolog謂詞

[英]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),
  ...

您現在可以通過使用XmonthXyearYmonthYyear變量編寫必要的比較來完成代碼嗎?

用一條規則來執行此操作是強制性的嗎? 您可以使用一個規則比較不同年份的雇員,使用第二個規則比較相同年份的雇員。 為了對此進行擴展,假設您以這種方式列出了員工:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM