% ===== PROLOG RAPIDO (OneCompiler / GNU Prolog) ===== % minuscula = dato fijo | Mayuscula = variable | _ = no importa % Todo termina en punto | textos con 'comillas simples' :- initialization(main). % ----- HECHOS ----- marca(m1, 'Sony', 'Japon'). marca(m2, 'HP', 'USA'). % producto(Cod, Nombre, CodMarca, Stock, Vendidos) producto(p1, 'Audifonos', m1, 6, 6). producto(p2, 'Laptop', m2, 8, 3). producto(p3, 'Parlante', m1, 9, 8). % ----- CALCULAR (is) ----- quedan(Cod, Q) :- producto(Cod, _, _, S, V), Q is S - V. % + - * / //(entera) mod(residuo) decimales: / 3.0 % ----- COMPARAR ----- % > < >= =< =:=(igual) =\=(distinto) OJO: =< no <= % ----- Y , O ; NO \+ DISTINTO \= ----- es_sony(Cod) :- producto(Cod, _, m1, _, _). critico_o_agotado(Cod) :- quedan(Cod, Q), ( Q =:= 0 ; Q =< 2 ). no_sony(Cod) :- producto(Cod, _, _, _, _), \+ es_sony(Cod). % ----- UNIR HECHOS (mismo codigo) ----- prod_pais(Pais, Nom) :- marca(CM, _, Pais), producto(_, Nom, CM, _, _). % ----- IF-THEN-ELSE ----- estado(Cod, E) :- quedan(Cod, Q), ( Q =:= 0 -> E = agotado ; Q =< 2 -> E = critico ; E = disponible ). % ----- VALIDAR ----- puede_vender(Cod, C) :- quedan(Cod, Q), C > 0, C =< Q. % ----- CONDICION + CALCULO ----- pedir(Nom, P) :- producto(Cod, Nom, _, _, _), quedan(Cod, Q), Q =< 2, P is 5 - Q. % ----- SUMA DE LISTA ----- suma_lista([], 0). suma_lista([H|T], S) :- suma_lista(T, S1), S is H + S1. % ----- REPORTE (forall) ----- reporte :- forall(producto(Cod, Nom, CM, _, _), ( marca(CM, NM, _), estado(Cod, E), write(Nom), write(' | '), write(NM), write(' | '), write(E), nl )). % ----- MAIN (aqui van las consultas) ----- main :- quedan(p2, Q), write('Quedan: '), write(Q), nl, ( puede_vender(p2, 3) -> write('Si') ; write('No') ), nl, forall(prod_pais('Japon', N), (write(N), nl)), ( producto(_, N2, _, _, _), write(N2), nl, fail ; true ), findall(S, producto(_, _, _, S, _), L), suma_lista(L, T), write(T), nl, findall(x, es_sony(_), L2), length(L2, C), write(C), nl, findall(M, (critico_o_agotado(Cd), producto(Cd, _, M, _, _)), L3), sort(L3, Unicos), write(Unicos), nl, forall(pedir(Np, P), (write(Np), write(' -> '), write(P), nl)), reporte. % ----- CHULETA ----- % X = 3+2 -> no calcula (3+2) X is 3+2 -> 5 % 4*2 == 8 -> falso 4*2 =:= 8 -> verdadero % forall(Cond, (Accion)) -> todas las soluciones % ( Cond, write(X), nl, fail ; true ) -> todas (otra forma) % findall(X, Cond, L) -> lista % findall(x, Cond, L), length(L, N) -> contar % findall(V, Cond, L), suma_lista(L, T) -> sumar % findall(X, Cond, L), sort(L, U) -> sin repetidos % ( Cond -> Si ; true ) -> solo if % Regla sin argumentos: en main solo su nombre -> reporte,