UTNianos

Versión completa: Ayuda Logico mumuki - Ejercicio 8: TEG 2
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Buenas! Alguno me podría ayudar con este ejercicio ?

https://mumuki.io/exercises/2537-programacion-logica-practica-negacion-y-cuantificacion-teg-2

Mi solución fue esta, pero me sigue fallando creo que en "estaPeleado":

ocupaContinente(Jugador,Continente):-
forall(ocupa(Pais,Jugador,_),estaEn(Pais,Continente)).

estaPeleado(Continente):-
forall(estaEn(Pais,Continente),ocupa(Pais,Jugador,_)).

seAtrinchero(Jugador):-
ocupa(Pais,Jugador,_),
estaEn(_,Pais).



ADJUNTO TAMBIÉN EL ENUNCIADO:
Agregamos más información a nuestra base de conocimientos que nos dice en qué continente se encuentra cada país mediante el predicado estaEn/2 que relaciona un continente y un país.

Con esta nueva información definí los siguientes predicados:

ocupaContinente/2 que relaciona un jugador y un continente si el jugador ocupa todos los países del mismo.
estaPeleado/1 que se cumple para los continentes en los cuales todos los jugadores ocupan algún país.
seAtrinchero/1 que se cumple para los jugadores que ocupan países en un único continente.

Asumí que ocupa/3 que relaciona un país con un jugador ya se encuentra definido también.
Se me ocurrio de esta manera , fíjate q estas poniendo mal los parámetros , estaEn relaciona continente y pais(pusiste al revez)

seAtrinchero(Jugador):- estaEn(Continente,_),forall(ocupa(Pais,Jugador,_),estaEn(Continente,Pais)).

ocupaContinente(Jugador,Continente):-
forall(estaEn(Continente,Pais),ocupa(Pais,Jugador,_)).

/* Tendria q ser algo asi , pero me cuesta sacarlo sin la base de conocimiento*/

estaPeleado(Continente):-
estaEn(Continente,_),forall(estaEn(Continente,Pais),ocupa(Pais,_,_)).
Por lo que vi de los datos que te dan esta seria la base:

ocupa(argentina, magenta, 5).
ocupa(chile, negro, 3).
ocupa(brasil, amarillo, 8).
ocupa(uruguay, magenta, 5).
ocupa(alaska, amarillo, 7).
ocupa(yukon, amarillo, 1).
ocupa(canada, amarillo, 10).
ocupa(oregon, amarillo, 5).
ocupa(kamtchatka, negro, 6).
ocupa(china, amarillo, 2).
ocupa(siberia, amarillo, 5).
ocupa(japon, amarillo, 7).
ocupa(australia, negro, 8).
ocupa(sumatra, negro, 3).
ocupa(java, negro, 4).
ocupa(borneo, negro, 1).

estaEn(americaDelSur, argentina).
estaEn(americaDelSur, brasil).
estaEn(americaDelSur, chile).
estaEn(americaDelSur, uruguay).
estaEn(americaDelNorte, alaska).
estaEn(americaDelNorte, yukon).
estaEn(americaDelNorte, canada).
estaEn(americaDelNorte, oregon).
estaEn(asia, kamtchatka).
estaEn(asia, china).
estaEn(asia, siberia).
estaEn(asia, japon).
estaEn(oceania,australia).
estaEn(oceania,sumatra).
estaEn(oceania,java).
estaEn(oceania,borneo).

Acabo de probar con tu solución pero también rompe jeje.
La solucion que dio nicolassierra esta perfecto para los predicados ocupaContinente y seAtrinchero. El predicado estaPelado, se deberia definir de esta forma:

estaPeleado(Continente):-
forall(ocupa(_,Jugador,_),(ocupa(Pais,Jugador,_),estaEn(Continente,Pais))).

Fijate modificando eso que deberia funcionar.
Tuve que investigar un poco como funcionaba el motor de prolog (ya que la curse hace 2 años jeje) pero me sirvió tu ayuda Nico, la solución me quedo así:

% para TODO pais de ese continente, se cumple que es ocupado por el mismo jugador
ocupaContinente(Jugador,Continente):-
forall(estaEn(Continente,Pais),ocupa(Pais,Jugador,_)).

% para TODOS los jugadores, se cumple que cada jugador ocupa un pais que esta en ese continente
estaPeleado(Continente) :- forall(ocupa(_,Jugador,_),(ocupa(Pais,Jugador,_),estaEn(Continente,Pais))).

% para todos los paises que ocupa UN jugador, se cumple que estan en el MISMO continente
seAtrinchero(Jugador) :-
estaEn(Continente,_), % generamos (unificamos el valor de Continente)
forall(ocupa(Pais,Jugador,_),estaEn(Continente,Pais)).
URLs de referencia