He estat treballant amb PROLOG. Sí, ho sé, després d'això mai podré arribar a cap posició respectable a la societat, jajaja. La cosa està en que he estat investigant sobre les funcions de input i output i aquí us deixo una petita mostra de com fer un petit programa de preguntes i respostes on s'interactua amb l'usuari. Aquí us deixo el codi i tot seguit passarem a donar una explicació pels elements que en formen part:
%%
%% Emparellament pregunta-resposta:
%%
oinkOink(1,'qui mola molt?','el masana').
oinkOink(2,'on van les llibretes voladores en epoca de zel?','cap a escocia').
oinkOink(3,'detras de ti! un mono de tres cabezas!','turum turum').
%%
%% mocMoc et pregunta i mira si respons bé
%%
mocMoc(Numero):-oinkOink(Numero,Pregunta,Resposta),write(Pregunta),nl, read(Resposta).
%%
%% el programa:
%%
meh_luv_wiminz('exit'):-write('Bye bye!').
meh_luv_wiminz('start'):-write('Welcome to the Super Quiz!'), nl, meh_luv_wiminz('main').
meh_luv_wiminz('main'):-nl, write('Which question do you want? exit to end'), nl, read(SeguentPregunta), nl, ((mocMoc(SeguentPregunta), write('That was correct!')); write('That was incorrect! The answer is: '), oinkOink(SeguentPregunta,_,RealAnswer), write(RealAnswer)), meh_luv_wiminz('main').
%%
%% emmascarat:
%%
potopom:-meh_luv_wiminz('start').
Aquestes són les funcions que utilitzem:
- write(X): mostra per pantalla l'element X. Si volem que tregui una cadena de caràcters utilitzarem apòstrofs a cada costat. Exemple: write('Hola, té pastilles contra la mala llet, calb de merda?').
- read(X): guarda a la variable X el que s'ha escrit per pantalla. Qualsevol cosa escrita per pantalla ha d'acabar amb un punt. Exemple: 'menja-pedres volador'.
- nl: new line, fa un salt incondicional a la línia inferior.
El que fem es crear una sèrie de predicats que relacionen el número de la pregunta, la pregunta i la seva resposta. És important destacar que el número de la pregunta seria com una clau primària, és a dir, que no es pot repetir perquè sinó podria donar lloc a respostes múltiples. Si volem fer algun tipus de regla en comptes de predicats també es pot utilitzar. Jo he anomenat als predicats oinkOink, com el soroll que fan els porquets.
Després cal crear una regla que ens permeti fer una pregunta i comprobar si la resposta que donem és la correcta. Per això utilitzem la regla mocMoc, com el soroll que fa el Pingu. A mocMoc se li passa el número de la pregunta i aleshores et fa la pregunta i espera que tu li responguis. Si la pregunta i la resposta estan relacionades (amb el predicat oinkOink), aleshores mocMoc serà
true, sinó serà
false.
Finalment, el nostre programa, meh_luv_wiminz. El definim de tres maneres segons el paràmetre que li passem:
- si rep un 'exit' el programa escriurà per pantalla 'Bye bye!' i s'acabarà.
- si rep un 'start' el programa saludarà l'usuari i passarà al 'main', la part principal del programa.
- si rep un 'main' entrarà a la part recursiva i més xunga de totes. Com que la variable d'entrada ja està fixada (el 'main') totes les condicions que defineixen el programa s'hauran de complir en l'ordre usual (d'esquerra a dreta). Així doncs, el programa fa una nova línia, escriu per pantalla 'Which question do you want? exit to end', fa una altra línia i espera que l'usuari escrigui. Totes aquestes accions no suposen cap mena de càlcul pel prolog, simplement, com que estan separades per comes (que són els AND o I lògiques) les anirà realitzant en l'ordre que toquen. Arribats en aquest punt i després de fe una nova línia, el prolog es troba amb un parentesi molt gran que a dins conté dues accions separades per un punt i coma (que són els OR o O lògics). Per tant, en aquest punt, el prolog decidirà que si es compleix la primera opció, ja no caldrà fer la segona. I si la primera opció dona fals, obligarà la segona a complir-se. Aquestes són les dues opcions:
- 1a opció: mocMoc es true, és a dir, la pregunta i la resposta de l'usuari estàn relacionades mitjançant oinkOink; i després afegeix 'That was correct!".
- 2a opció: esciu 'That was incorrect! The answer is: ' i tot seguit busca la resposta correcta mitjançant l'emparellament pregunta-resposta de l'oinkOink i l'escriu per pantalla.
Després, hagi estat la opció que hagi estat, torna a cridar recursivament el 'main', perquè torni a preguntar una altra pregunta fins que no se li entri 'exit'.
Per últim, per tal de reduir
meh_luv_wiminz('start'), que és la ordre que inicia el programa, fem un emmascarament. Un emmascarament no és res més que fe runa cosa més maca o senzilla. Per a això, definim el predicat
ex com
meh_luv_wiminz('start').
Així doncs, ara només cal que al
SWI-Prolog carregueu un arxiu
.pl amb el codi que us he donat, i a continuació escriviu
potopom. i gaudiu del programa.
Espero que us faci servei algun dia! ^^