Prolog-Prädikat, die Werte in Fakten vergleicht

stimmen
0

Dies ist mein erstes Mal mit Prolog

Ich habe Mitarbeiter

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

Beispiel:

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

Ich mag ein Prädikat machen , senior(X,Y)die wahr zurück, wenn der erste Mitarbeiter älter in der Gesellschaft ist.

Ich habe das:

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

aber dies immer false zurück. Ich kann den Grund verstehen.

Wie kann ich dieses Prädikat Arbeit machen?

Veröffentlicht am 18/12/2018 um 11:14
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
1

Ist es zwingend notwendig, dass Sie dies tun mit einer Regel? Sie könnten eine Regel verwenden, um Mitarbeiter zu vergleichen, die in verschiedenen Jahren eingestellt wurden, und eine zweite Regel für die Mitarbeiter zu vergleichen, die im selben Jahr eingestellt wurde. Um auf diese zu erweitern, sagen wir, Sie haben die Mitarbeiter auf diese Weise aufgeführt:

employee(eid,year,month,day)

und, natürlich, eine Liste der Mitarbeiter. Sie könnten die folgenden drei Regeln verwenden:

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

Achten Sie darauf , nicht vergessen und ersetzen „Jahr“ und / oder „Monat“ mit Unterstrichen, denn dann gemietet jemand auf 2010-01-01 (ISO 8601) als Senior angeheuert , um jemanden zu zeigen würde 2005-12-12 .

Dann wieder, vielleicht sollten Sie alle Termine im Katalog 2004: ISO 8601 . Egal wie groß Ihre Mitarbeiterliste, können Sie ein kleines Skript schreiben zu konvertieren

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

zu

employee(eID,firstname,lastname,yyyymm)
Beantwortet am 27/12/2018 um 14:33
quelle vom benutzer

stimmen
1

In Prolog startet Variablen entweder mit einem Unterstrich oder einem Großbuchstaben. ZB firstnameist ein Atom , das heißt eine Konstante ist , sondern FirstNameist eine Variable . Aber in Ihre spezielle Frage, Sie kümmern sich nicht um den Namen der Mitarbeiter. So können Sie diese Argumente durch die ersetzen anonyme Variable:

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

Können Sie jetzt den Code vervollständigen , indem sie die notwendigen Vergleiche Schreiben der Verwendung von Xmonth, Xyear, Ymonthund YyearVariablen?

Beantwortet am 18/12/2018 um 11:21
quelle vom benutzer

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