Prolog prédicat qui compare les valeurs dans les faits

voix
0

Ceci est ma première fois à l'aide Prolog

J'ai employés

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

Exemple :

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

Je veux faire un prédicat senior(X,Y)qui retourne vrai si le premier employé est plus dans l'entreprise.

J'ai ceci:

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

mais ce retour toujours faux. Je ne comprends pas la raison.

Comment puis-je faire ce travail prédicat?

Créé 18/12/2018 à 11:14
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
1

En Prolog, les variables commencent par soit un trait de soulignement ou une lettre majuscule. Par exemple , firstnameest un atome , soit une constante, mais FirstNameest une grandeur . Mais, dans votre question, vous ne vous souciez pas les noms des employés. Ainsi, vous pouvez remplacer ces arguments par l' anonyme variable:

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

Pouvez - vous compléter maintenant le code en écrivant les comparaisons nécessaires avec les Xmonth, Xyear, Ymonth, et les Yyearvariables?

Créé 18/12/2018 à 11:21
source utilisateur

voix
1

Est-il obligatoire que vous le faites avec une règle? Vous pouvez utiliser une règle pour comparer les employés qui ont été embauchés dans des années différentes, et une deuxième règle pour comparer les employés qui ont été embauchés la même année. Pour développer cela, disons que vous avez des employés énumérés ainsi:

employee(eid,year,month,day)

et, bien sûr, une liste des employés. Vous pouvez utiliser les trois règles suivantes:

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

Assurez-vous de ne pas oublier et de remplacer « Année » et / ou « Mois » avec des underscores, parce que quelqu'un embauché 2010-01-01 (ISO 8601) sera présenté comme principal à quelqu'un embauché sur 2005-12-12 .

Là encore, peut - être vous devriez cataloguer toutes les dates ISO 8601: 2004 . Peu importe la taille de votre liste d'employés, vous pouvez écrire un petit script pour convertir

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

à

employee(eID,firstname,lastname,yyyymm)
Créé 27/12/2018 à 14:33
source utilisateur

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