Prolog predicado que compara valores em fatos

votos
0

Esta é minha primeira vez usando Prolog

Eu tenho funcionários

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

exemplo:

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

Eu quero fazer um predicado senior(X,Y)que irá retornar true se o primeiro empregado é mais velho na empresa.

Eu tenho isto:

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

mas isso sempre retornar falso. Eu não consigo entender a razão.

Como posso fazer este trabalho predicado?

Publicado 18/12/2018 em 11:14
fonte usuário
Em outras línguas...                            


2 respostas

votos
1

Em Prolog, variáveis começar com qualquer um sublinhado ou uma letra maiúscula. Por exemplo, firstnameé um átomo , isto é, uma constante, mas FirstNameé uma variável . Mas, na sua pergunta específica, você não se preocupam com os nomes de funcionários. Assim, você pode substituir esses argumentos pelo anônimo variável:

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

Agora você pode completar o código escrevendo as comparações necessárias usando os Xmonth, Xyear, Ymonth, e Yyearvariáveis?

Respondeu 18/12/2018 em 11:21
fonte usuário

votos
1

É obrigatório que você faça isso com uma regra? Você poderia usar uma regra para comparar os funcionários que foram contratados em anos diferentes, e uma segunda regra para comparar os empregados que foram contratados no mesmo ano. Para expandir a este, digamos que você tem empregados listados desta forma:

employee(eid,year,month,day)

e, claro, uma lista de funcionários. Você pode usar as três regras seguintes:

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

Certifique-se de que você não se esqueça e substituir "Ano" e / ou "Mês" com sublinhados, porque então alguém contratado em 2010-01-01 (ISO 8601) seria mostrado como sênior com alguém contratado em 2005-12-12 .

Então, novamente, talvez você deve catalogar todas as datas na ISO 8601: 2004 . Não importa o quão grande é a sua lista de funcionários, você poderia escrever um pequeno script para converter

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

para

employee(eID,firstname,lastname,yyyymm)
Respondeu 27/12/2018 em 14:33
fonte usuário

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