Autor Tema: Uso de listas y Prolog

0 Usuarios y 1 Visitante están viendo este tema.

26 Julio, 2024, 03:06 am
Leído 501 veces

manooooh

  • $$\Large \color{#9c57a6}\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 4,791
  • País: ar
  • Karma: +1/-0
  • Sexo: Masculino
Hola!

Supongamos que tenemos la siguiente base de conocimientos en Prolog:

Código: [Seleccionar]
% tiene(Persona, Ropa)
% remera(Color)
% sombrero(NivelDeMagia, Color)

tiene(ana, remera(blanco)).
tiene(ana, remera(rojo)).
tiene(ana, sombrero(2, blanco)).
tiene(juan, remera(rojo)).
tiene(juan, sombrero(1, negro)).

Queremos saber si alguien ganó, que sucede cuando tiene más sombreros blancos que negros. En el ejemplo, Ana es la única que ganó, porque tiene 1 sombrero blanco y 0 negros.

Mi intento fue generar, por un lado, los sombreros blancos y los negros a través de findall/3, contarlos usando length/2 y luego comparar ambos números:

Código: [Seleccionar]
gano(Alguien) :-
    tiene(Alguien, _),
    findall(_, tiene(Alguien, sombrero(_, blanco)), Blanco),
    length(Blanco, CantidadBlanco),
    findall(_, tiene(Alguien, sombrero(_, negro)), Negro),
    length(Negro, CantidadNegro),
    CantidadBlanco > CantidadNegro.

Este código funciona (al preguntar gano(Alguien) contesta Ana y luego da false), pero me da la impresión que no estoy haciendo un buen uso de findall.

Porque estoy usando _ en el primer parámetro, y ahí necesitaría una variable.

¿A alguien se le ocurre cómo arreglarlo? O quizás usar otro predicado como forall/2 o member/2 para conseguir el resultado.

Gracias!!
Saludos