Prolog predykatu, który porównuje wartości w faktach

głosy
0

To jest mój pierwszy raz przy użyciu Prolog

Mam pracowników

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

Przykład:

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

Chcę, aby predykat senior(X,Y), która zwraca wartość true, jeśli pierwsza jest starszy pracownik w firmie.

Mam to:

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

ale to zawsze return false. Nie mogę zrozumieć, dlaczego.

W jaki sposób można dokonać tej pracy źródłowe?

Utwórz 18/12/2018 o 11:14
źródło użytkownik
W innych językach...                            


2 odpowiedzi

głosy
1

Jest to obowiązkowe, że robisz to z jednej reguły? Można używać jednej reguły dla porównania pracowników, którzy zostali zatrudnieni w różnych latach i drugą zasadę porównywania pracowników, którzy zostali zatrudnieni w tym samym roku. Aby rozwinąć na to, powiedzmy masz pracowników wymienionych w ten sposób:

employee(eid,year,month,day)

i, oczywiście, lista pracowników. Można stosować następujące trzy zasady:

% 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.

Upewnij się, że nie zapomni i wymienić „rok” i / lub „miesiąc” podkreślenia, bo wtedy ktoś zatrudniony na 2010-01-01 (ISO 8601) będzie pokazany jako starszy komuś najemnej na 2005-12-12 .

Następnie ponownie, być może należy skatalogować wszystkie daty ISO 8601: 2004 . Nie ważne jak duża jest Twoja lista pracownik, można napisać mały skrypt do konwersji

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

do

employee(eID,firstname,lastname,yyyymm)
Odpowiedział 27/12/2018 o 14:33
źródło użytkownik

głosy
1

W Prologu, zmienne zaczynać albo od podkreślenia lub wielką literą. Np firstnamejest atom , czyli stała, ale FirstNamejest zmienna . Ale w konkretnej kwestii, nie dbają o nazwach pracowniczych. W ten sposób można zastąpić te argumenty W anonimowej zmiennej:

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

Można teraz uzupełnić kod pisząc niezbędnych porównań za pomocą Xmonth, Xyear, Ymonthi Yyearzmienne?

Odpowiedział 18/12/2018 o 11:21
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more