Prolog predicado que compara los valores en los hechos

votos
0

Esta es la primera vez que el uso de Prolog

Tengo empleados

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

ejemplo:

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

Quiero hacer un predicado senior(X,Y)que devolverá verdadero si el primer empleado es mayor en la empresa.

Tengo esto:

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

pero esto siempre return false. No puedo entender la razón.

¿Cómo puedo hacer que esto funcione predicado?

Publicado el 18/12/2018 a las 11:14
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
1

¿Es obligatorio que lo haga con una regla? Se podría utilizar una regla para la comparación de los empleados que fueron contratados en diferentes años, y una segunda regla para la comparación de los empleados que fueron contratados en el mismo año. Para ampliar esta, digamos que usted tiene empleados enumeran de esta manera:

employee(eid,year,month,day)

y, por supuesto, una lista de los empleados. Usted podría utilizar las tres reglas siguientes:

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

Asegúrese de que no se olvide y reemplazar "Año" y / o "Mes", con guiones bajos, porque entonces alguien contratado en 2010-01-01 (ISO 8601) se muestra como superior a alguien contratado en 2005-12-12 .

Por otra parte, tal vez debería catalogar todas las fechas en la norma ISO 8601: 2004 . No importa cuán grande es su lista de empleados, se podría escribir un pequeño script para convertir

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

a

employee(eID,firstname,lastname,yyyymm)
Respondida el 27/12/2018 a las 14:33
fuente por usuario

votos
1

En Prolog, las variables comienzan ya sea con un guión o una letra mayúscula. Ej firstnamees un átomo , es decir, una constante, pero FirstNamees una variable de . Pero, en su pregunta específica, que no se preocupan por los nombres de los empleados. Por lo tanto, puede sustituir a los argumentos de los anónimos variables:

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

¿Puede usted ahora completar el código escribiendo las comparaciones necesarias utilizando los Xmonth, Xyear, Ymonth, y Yyearlas variables?

Respondida el 18/12/2018 a las 11:21
fuente por usuario

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