UTNianos

Versión completa: [PDEP]3. Negación y cuantificación 9. Universalidad, parte 1
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Ahora queremos saber si alguien está bien ubicado: esto ocurre cuando vive en una zona en la que están todos los destinos a los que quiere ir. Para eso, contamos con la nueva información de quiereIr/2:
quiereIr(fede, racing).
quiereIr(fede, montoto).
quiereIr(victoria, montoto).
quiereIr(tomas, montoto).
quiereIr(tomas, utn).
¿Pero cómo podemos hacer para saber si todos los lugares a donde quiere ir están en su zona? ¿Se te ocure alguna forma de resolverlo, usando sólo lo que vimos hasta ahora?
Escribí el predicado bienUbicado/1. Asumí que ya escribimos quiereIr/2 por vos.
¡Dame una pista!

Pensá que si en una zona están todos los lugares que uno quiere, eso significa... que no existe ningún lugar al que quiera ir y no esté en esa zona.
Y si las cosas se complican mucho, ¡delegá!
Si no recordás qué predicados ya existían, revisá la biblioteca .

Intente esto:
bienUbicado(Persona):- viveEn(Persona,Zona1), not
  (quiereIr(Persona,Lugar) && quedaEn(Lugar,Zona2)),
  Zona1\=Zona2.


y esto es lo que figura en la biblioteca:
viveEn(mariano, avellaneda).
viveEn(fede, avellaneda).
viveEn(victoria, versalles).
viveEn(rodrigo, villaBallester).
viveEn(tomas, nuniez).

quedaEn(utn, almagro).
quedaEn(utn, villaLugano).
quedaEn(exactas, nuniez).
quedaEn(river, nuniez).
quedaEn(racing, avellaneda).
quedaEn(montoto, palermo).
quedaEn(montoto, nuniez).
quedaEn(montoto, avellaneda).

tieneAuto(tomas).
tieneAuto(fede).

llegaFacil(batman, _).
llegaFacil(Persona, _) :-
tieneAuto(Persona).
llegaFacil(Persona, Destino) :-
viveEn(Persona, Zona),
quedaEn(Destino, Zona).

destinosProximos(Destino, OtroDestino) :-
quedaEn(Destino, Zona),
quedaEn(OtroDestino, Zona).

sonVecinos(UnaPersona, OtraPersona) :-
UnaPersona \= OtraPersona,
viveEn(UnaPersona, Zona),
viveEn(OtraPersona, Zona).

loLleva(UnaPersona, OtraPersona) :-
tieneAuto(UnaPersona),
not(tieneAuto(OtraPersona)),
sonVecinos(UnaPersona, OtraPersona).

quiereIr(fede, racing).
quiereIr(fede, montoto).
quiereIr(victoria, montoto).
quiereIr(tomas, montoto).
quiereIr(tomas, utn).


alguna idea de como hacerlo correctamente?
Se me ocurre de esta manera:
primero queres saber en q zona vive la persona.
segundo todos los lugares q quiera ir
tercero q todos esos lugares queden en la misma zona.



bienUbicado(Persona):- viveEn(Persona, Zona),forall(quiereIr(Persona, Lugar),quedaEn(Lugar, Zona))
Lo que decis funciona, pero el ejercicio pide usar el not.
Se me ocurre usando un predicado auxiliar.

bienUbicado(Persona):- viveEn(Persona, Zona),not(existeOtraZona(Persona,Zona)).

existeOtraZona(Persona,Zona):- quiereIr(Persona, Lugar),quedaEn(Lugar, Zona2),Zona2 \= Zona.

Si no existe otra zona , entonces va a devolver falso y con el not va a ser verdadero.
Con q existe otra zona , va a devolver verdadero y con el not va a ser falso.
URLs de referencia