/*
  donante(P, G, F)

  Predicado que comprueba si la persona P tiene el grupo sanguíneo G y el factor rh F

   Argumentos
  + P:
    - Significado: nombre de persona
    - Tipo: entrada y salida

  + G:
    - Significado: grupo sanguíneo  {0, A, B, AB}
    - Tipo: entrada y salida

  + F:
    - Significado: factor rh  {positivo, negativo}
    - Tipo: entrada y salida

  Estructura
  persona(Nombre,Apellido1,Apellido2)

 */
donante(persona(rodrigo,lara,silva),0,negativo).
donante(persona(ana,lara,silva),0,negativo).

donante(persona(juan,campos,ruiz),0,positivo).
donante(persona(amelia,campos,ruiz),0,positivo).

donante(persona(natalia,luna,pachecho),a,negativo).
donante(persona(luis,luna,pachecho),a,negativo).

donante(persona(pablo,aguirre,torres),a,positivo).
donante(persona(alicia,aguirre,torres),a,positivo).

donante(persona(laura,larra,siles),b,negativo).
donante(persona(hugo,larra,siles),b,negativo).

donante(persona(pedro,parra,puentes),b,positivo).
donante(persona(patricia,parra,puentes),b,positivo).

donante(persona(isabel,duarte,salazar),ab,negativo).
donante(persona(ignacio,duarte,salazar),ab,negativo).

donante(persona(teresa,aguilera,soto),ab,positivo).
donante(persona(ismael,aguilera,soto),ab,positivo).

/*
  donantes_ordenados_por_grupo_y_factor(Grupo, Factor, L)

  Predicado que comprueba si L es una lista compuesta por personas con el Grupo sanguíneo y el Factor rh indicados.

   Argumentos
  + Grupo:
    - Significado: grupo sanguíneo  {0, A, B, AB}
    - Tipo: entrada y salida

  + Factor:
    - Significado: factor rh  {positivo, negativo}
    - Tipo: entrada y salida


  + L:
    - Significado: lista de personas
    - Tipo: entrada y salida

  Estructura
  persona(Nombre,Apellido1,Apellido2)

  Predicados relacionados
  donante, setof
 */
donantes_ordenados_por_grupo_y_factor(Grupo,Factor,L):-
     setof(Persona,donante(Persona,Grupo,Factor),L).

donantes_ordenados_por_grupo(Grupo,L):-
     setof(Persona,Factor^donante(Persona,Grupo,Factor),L).
     
donantes_por_grupo(Grupo,L):-
     bagof(Persona,Factor^donante(Persona,Grupo,Factor),L).
     
/*
  donantes(L)

  Predicado que comprueba si L es una lista de donantes de sangre

  Argumentos
  + L:
    - Significado: lista de personas
    - Tipo: entrada y salida

  Estructura
  persona(Nombre,Apellido1,Apellido2)

  Predicados relacionados
  donante, findall
 */
     
donantes(L):-
     findall(Persona,donante(Persona,_,_),L).
     
