-
Notifications
You must be signed in to change notification settings - Fork 1
/
kioskito.pl
135 lines (108 loc) · 6.53 KB
/
kioskito.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
% Lógica de negocio
% Punto 1
% dodain atiende lunes, miércoles y viernes de 9 a 15.
atiende(dodain, lunes, 9, 15).
atiende(dodain, miercoles, 9, 15).
atiende(dodain, viernes, 9, 15).
% lucas atiende los martes de 10 a 20
atiende(lucas, martes, 10, 20).
% juanC atiende los sábados y domingos de 18 a 22.
atiende(juanC, sabados, 18, 22).
atiende(juanC, domingos, 18, 22).
% juanFdS atiende los jueves de 10 a 20 y los viernes de 12 a 20.
atiende(juanFdS, jueves, 10, 20).
atiende(juanFdS, viernes, 12, 20).
% leoC atiende los lunes y los miércoles de 14 a 18.
atiende(leoC, lunes, 14, 18).
atiende(leoC, miercoles, 14, 18).
% martu atiende los miércoles de 23 a 24.
atiende(martu, miercoles, 23, 24).
% Definir la relación para asociar cada persona con el rango horario que cumple, e incorporar las siguientes cláusulas:
% - vale atiende los mismos días y horarios que dodain y juanC.
atiende(vale, Dia, HorarioInicio, HorarioFinal):-atiende(dodain, Dia, HorarioInicio, HorarioFinal).
atiende(vale, Dia, HorarioInicio, HorarioFinal):-atiende(juanC, Dia, HorarioInicio, HorarioFinal).
% - nadie hace el mismo horario que leoC
% por principio de universo cerrado, no agregamos a la base de conocimiento aquello que no tiene sentido agregar
% - maiu está pensando si hace el horario de 0 a 8 los martes y miércoles
% por principio de universo cerrado, lo desconocido se presume falso
%
% En caso de no ser necesario hacer nada, explique qué concepto teórico está relacionado y justifique su respuesta.
% Punto 2: quién atiende el kiosko... (2 puntos)
% Definir un predicado que permita relacionar un día y hora con una persona, en la que dicha persona atiende el
% kiosko. Algunos ejemplos:
% si preguntamos quién atiende los lunes a las 14, son dodain, leoC y vale
% si preguntamos quién atiende los sábados a las 18, son juanC y vale
% si preguntamos si juanFdS atiende los jueves a las 11, nos debe decir que sí.
% si preguntamos qué días a las 10 atiende vale, nos debe decir los lunes, miércoles y viernes.
%
% El predicado debe ser inversible para relacionar personas y días.
quienAtiende(Persona, Dia, HorarioPuntual):-
atiende(Persona, Dia, HorarioInicio, HorarioFinal),
between(HorarioInicio, HorarioFinal, HorarioPuntual).
% Punto 3: Forever alone (2 puntos)
% Definir un predicado que permita saber si una persona en un día y horario
% determinado está atendiendo ella sola. En este predicado debe utilizar not/1,
% y debe ser inversible para relacionar personas.
foreverAlone(Persona, Dia, HorarioPuntual):-
quienAtiende(Persona, Dia, HorarioPuntual),
not((quienAtiende(OtraPersona, Dia, HorarioPuntual), Persona \= OtraPersona)).
% Punto 4: posibilidades de atención (3 puntos / 1 punto)
% Dado un día, queremos relacionar qué personas podrían estar atendiendo el kiosko
% en algún momento de ese día.
posibilidadesAtencion(Dia, Personas):-
findall(Persona, distinct(Persona, quienAtiende(Persona, Dia, _)), PersonasPosibles),
combinar(PersonasPosibles, Personas).
combinar([], []).
combinar([Persona|PersonasPosibles], [Persona|Personas]):-combinar(PersonasPosibles, Personas).
combinar([_|PersonasPosibles], Personas):-combinar(PersonasPosibles, Personas).
% Qué conceptos en conjunto resuelven este requerimiento
% - findall como herramienta para poder generar un conjunto de soluciones que satisfacen un predicado
% - mecanismo de backtracking de Prolog permite encontrar todas las soluciones posibles
% Punto 5: ventas / suertudas (4 puntos)
% En el kiosko tenemos por el momento tres ventas posibles:
% - golosinas, en cuyo caso registramos el valor en plata
% - cigarrillos, de los cuales registramos todas las marcas de cigarrillos que se vendieron (ej: Marlboro y Particulares)
% - bebidas, en cuyo caso registramos si son alcohólicas y la cantidad
%
% Queremos agregar las siguientes cláusulas:
% dodain hizo las siguientes ventas el lunes 10 de agosto: golosinas por $ 1200, cigarrillos Jockey, golosinas por $ 50
venta(dodain, fecha(10, 8), [golosinas(1200), cigarrillos(jockey), golosinas(50)]).
% dodain hizo las siguientes ventas el miércoles 12 de agosto: 8 bebidas alcohólicas,
% 1 bebida no-alcohólica, golosinas por $ 10
venta(dodain, fecha(12, 8), [bebidas(true, 8), bebidas(false, 1), golosinas(10)]).
% martu hizo las siguientes ventas el miercoles 12 de agosto: golosinas por $ 1000, cigarrillos Chesterfield, Colorado y Parisiennes.
venta(martu, fecha(12, 8), [golosinas(1000), cigarrillos([chesterfield, colorado, parisiennes])]).
% lucas hizo las siguientes ventas el martes 11 de agosto: golosinas por $ 600.
venta(lucas, fecha(11, 8), [golosinas(600)]).
% lucas hizo las siguientes ventas el martes 18 de agosto: 2 bebidas no-alcohólicas y cigarrillos Derby.
venta(lucas, fecha(18, 8), [bebidas(false, 2), cigarrillos([derby])]).
% Queremos saber si una persona vendedora es suertuda, esto ocurre si para todos los días en los que vendió,
% la primera venta que hizo fue importante. Una venta es importante:
% - en el caso de las golosinas, si supera los $ 100.
% - en el caso de los cigarrillos, si tiene más de dos marcas.
% - en el caso de las bebidas, si son alcohólicas o son más de 5.
personaSuertuda(Persona):-
vendedora(Persona),
forall(venta(Persona, _, [Venta|_]), ventaImportante(Venta)).
vendedora(Persona):-venta(Persona, _, _).
ventaImportante(golosinas(Precio)):-Precio > 100.
ventaImportante(cigarrillos(Marcas)):-length(Marcas, Cantidad), Cantidad > 2.
ventaImportante(bebidas(true, _)).
ventaImportante(bebidas(_, Cantidad)):-Cantidad > 5.
% Tests
:-begin_tests(kioskito).
test(atienden_los_viernes, set(Persona = [vale, dodain, juanFdS])):-
atiende(Persona, viernes, _, _).
test(personas_que_atienden_un_dia_puntual_y_hora_puntual, set(Persona = [vale, dodain, leoC])):-
quienAtiende(Persona, lunes, 14).
test(dias_que_atiende_una_persona_en_un_horario_puntual, set(Dia = [lunes, miercoles, viernes])):-
quienAtiende(vale, Dia, 10).
test(una_persona_esta_forever_alone_porque_atiende_sola, set(Persona=[lucas])):-
foreverAlone(Persona, martes, 19).
test(persona_que_no_cumple_un_horario_no_puede_estar_forever_alone, fail):-
foreverAlone(martu, miercoles, 22).
test(posibilidades_de_atencion_en_un_dia_muestra_todas_las_variantes_posibles, set(Personas=[[],[dodain],[dodain,leoC],[dodain,leoC,martu],[dodain,leoC,martu,vale],[dodain,leoC,vale],[dodain,martu],[dodain,martu,vale],[dodain,vale],[leoC],[leoC,martu],[leoC,martu,vale],[leoC,vale],[martu],[martu,vale],[vale]])):-
posibilidadesAtencion(miercoles, Personas).
test(personas_suertudas, set(Persona = [martu, dodain])):-
personaSuertuda(Persona).
:-end_tests(kioskito).