Un saluto a tutti.
Avrei bisogno di un aiuto, in quanto sto avendo un po' di grattacapi nel fare un 'coursework' per il mio corso universitario (logica).
Vengo subito al punto: devo implementare un programma (in prolog) che dimostri la validita' o meno di una formula, usando il sistema tableau. Prima pero' devo essere in grado di stabilire se la formula immessa e' sintatticamente giusta.
Per prima cosa ho trasformato la stringa in input in una lista:
listify(String,[List]):-
sub_string(String, 0, 1, 0, Sub_string),
string_to_atom(Sub_string,List).
listify(String,[Element|List]):-
sub_string(String, 0, 1, _, Sub_string),
string_to_atom(Sub_string,Element),
sub_string(String,1,_,0,Mod_string),
listify(Mod_string,List).
Ora devo pero' "formattarla"; mi spiego meglio: per potervi applicare la definizione ricorsiva di una formula (form::=literal|¬form|(form * form)), devo trasformare la mia lista da "piatta" in "ricorsiva".
Es: formula da convalidare (¬p>(r^¬(p^q)))
la lista "piatta" prodotta da listify sara': [(,¬,p,>,(,r,^,¬,(,p,^,q,),),)]
la lista "ricorsiva" che mi serve e' invece: [(,[ ¬, p],>,[(,r,^,[¬,[(,p,^,q,)]],)], )]
Sono abbastanza sicuro che la lista "ricorsiva", o lista di liste se preferite, funzioni, perche' ho gia' scritto un preditcato per convalidarla che funziona con un input di quel tipo:
openbr('(').
closebr(')').
prop(p).
prop(q).
prop(r).
is_form(Form):-
prop(Form).
is_form([OB,Form,CB]):-
openbr(OB),
is_form(Form),
closebr(CB).
is_form([Form|Tail]):-
is_form(Form),
Tail=[].
is_form([[Neg|Form]|_]):- % negation of negation of neg...
Neg='-',
is_form(Form).
is_form([Neg|Form]):-
Neg='-',
is_form(Form).
is_form([Branch1|[F1|[O|[F2|[Branch2|X]]]]]):-
X=[],
openbr(Branch1),
is_form(F1),
bin(O),
is_form(F2),
closebr(Branch2); /*ELSE*/
openbr(Branch1),
is_form(F1),
bin(O),
is_form(F2),
closebr(Branch2),
is_form(X).
probabilmente e' un po pleonastica e prolissa, ma sembra funzionare...
Praticamente ogni volta che incontro una parentesi aperta devo inserire una nuova lista:
(,...), --->[(,....)] e stessa cosa per le negazioni.
Il tutto alla fine dovrebbe apparire cosi':
form(String):-
listify(String,List),
format_list(List,Formatted_list)
is_form(Formatted_list),
write('\''), write(String), write('\' is a formula.');
write('\''), write(String), write('\' is NOT a formula.'),!,fail.
Sono proprio all'inizio con prolog, vi prego aiutatemi, e non esitate a chiedermi ulteriori delucidazioni, perche' probabilmente mi sono spiegato da cani!!!
Ah, uso swi prolog (http://www.swi-prolog.org/).
Grazie, buone feste, Giacomo