Pages: 1 [2]   Go Down
Print
Author Topic: Check esercizio  (Read 2771 times)
0 Members e 1 Utente non registrato stanno visualizzando questa discussione.
Franco Barbanera
Moderator
Forumista Eroico
*****
Offline Offline

Posts: 3.077



WWW
« Reply #15 on: 08-01-2014, 16:53:37 »


Quote
la richiesta di parsing io l'ho fatta così
IDmanager!{requestParsing,self(),[a,c,a,a]}.

Perfetto.

Quote
ma come mi metto in attesa del risultato??

ma se te l'ho scritto nel messaggio precedente!?!

 aspetti il risultato valutando la seguente receive:

receive
   {X,[a,c,a,a]} -> true
end.

e poi valutando X.


Quote
io avevo pensato di fare {X,List} = IDmanager!{requestParsing,self(),[a,c,a,a]}.
ma mi da errore. 

E ci mancherebbe pure che non ti desse errore!!!
Stai facendo un pattern matching tra una tupla ed il valore di una espressione send...

Fammi sapere.

FB
Logged
SixArt
Matricola
*
Offline Offline

Gender: Male
Posts: 51



« Reply #16 on: 09-01-2014, 10:50:27 »

Ho avuto un problema col fatto che quando si cercava il pid di none esso non fosse presente.
Allora se abbiamo un automa che accetta stringhe della forma

a(bb)*+bba*


con tabella di transizione

         a        b
0       1        2       notfinal
   none    4       final
2     none    3       notfinal
3       3      none   final
4     none    1       notfinal

ho pensato di aggiungere una nuova riga della forma

none     none    none       notfinal

così facendo viene associato un pid anche a none.
Facendo così il codice funziona  beer

Code:
-module(regExprGen).
-export([create/3,manager/0,state/2,firstList2secondlist/2,myTransFun/3]).

%POSITION
position(Elem,[Elem|_]) ->1;
position(Elem,[_|Rest]) ->1+position(Elem,Rest).



%MYTRANSFUN
myTransFun(TransList,CharsList,StatesList) ->
fun(PID,Char) ->
lists:nth(position(Char,CharsList),lists:nth(position(PID,StatesList),TransList))
end.




%FIRSTLIST2SECONDLIST restituisce una funzione che dato un elemento della prima lista restituisce quello della seconda nella stessa posizione
firstList2secondlist([One|Ones],[Two|Twos]) ->
fun(Elem)-> if
(Elem == One)  -> Two;
true             -> F = firstList2secondlist(Ones,Twos), F(Elem)
end
end.


%TRANSFUN2TRANSFUNPIDS ci dice in che stato passare
transFun2transFunPIDS(TransFun,PIDSList,StatesList) ->
fun(PID,Char) ->
State2pid = firstList2secondlist(StatesList,PIDSList),
Pid2state = firstList2secondlist(PIDSList,StatesList),
State2pid(TransFun(Pid2state(PID),Char))
end.



%CREATE crea l'automa
create(StatesList,TransFun,FinalFun) ->
IDmanager = spawn(regExprGen,manager,[]),
StatesPIDS = [spawn(regExprGen,state,[IDmanager,FinalFun(State)]) || State <- StatesList],
[QInit|_] = StatesPIDS,
TransFunPIDS = transFun2transFunPIDS(TransFun,StatesPIDS,StatesList),
IDmanager!QInit,
[IDQ!TransFunPIDS || IDQ <- StatesPIDS ],
IDmanager.


%MANAGER
manager() -> receive
IDinitial -> loopmanager(IDinitial)
end.



%LOOPMANAGER
loopmanager(IDinitial) -> receive
{requestParsing,ID,List} -> IDinitial ! {List,ID,List};
        {accepted,ID,List}       -> ID ! {accepted,List};
{rejected,ID,List}       -> ID ! {rejected,List}
end,
        loopmanager(IDinitial).



%STATE
state(IDmanager,Final) -> receive
TransFunPIDS -> loop(TransFunPIDS,IDmanager,Final)
end.



%LOOP
loop(TransFunPIDS,IDmanager,Final) -> receive
{[],ID,List}          ->    if
                                    (Final == final)  -> IDmanager ! {accepted,ID,List};
                                         true             -> IDmanager ! {rejected,ID,List}
                                    end;
{[ Char | Cs ],ID,List}  ->  Next = TransFunPIDS(self(),Char),
                                    if
                                    (Next == none)    ->  IDmanager ! {rejected,ID,List};
                                         true             ->  Next ! {Cs,ID,List}
    end
end,
loop(TransFunPIDS,IDmanager,Final).

Per provare da shell con l'automa sopra descritto dobbiamo scrivere (riga per riga) e otteniamo l'id del manager :
Code:
c(regExprGen).
CharsList = [a,b].
StatesList = [0,1,2,3,4,none].
TransList = [[1,2],[none,4],[none,3],[3,none],[none,1],[none,none]].
FinalList = [notfinal,final,notfinal,final,notfinal,notfinal].
FinalFun = regExprGen:firstList2secondlist(StatesList,FinalList).
TransFun = regExprGen:myTransFun(TransList,CharsList,StatesList).
IDmanager = regExprGen:create(StatesList,TransFun,FinalFun).

Le stringhe che ho passato per prova
abbbb e ababb

Code:
IDmanager!{requestParsing,self(),[a,b,b,b,b]}.
receive
{X,[a,b,b,b,b]} -> true
end.
X. da risposta accepted
Code:
IDmanager!{requestParsing,self(),[a,b,a,b,b]}.
receive         
{Y,[a,b,a,b,b]} -> true     
 end.
   
Y. da risposta rejected 
Logged
SixArt
Matricola
*
Offline Offline

Gender: Male
Posts: 51



« Reply #17 on: 10-01-2014, 21:54:07 »

Ecco la versione del codice finale  beer beer
qui non c'è bisogno di aggiungere lo stato none e la relativa riga di transizione, inoltre nella richiesta di parsing è possibile inserire un carattere non presente nella CharsList, questo viene rilevato e l'automa restituisce rejected.

Code:
-module(regExprGen).
-export([create/3,manager/0,state/2,firstList2secondlist/2,myTransFun/3]).

%POSITION
position(Elem,[Elem|_]) ->1;
position(Elem,[_|Rest]) ->1+position(Elem,Rest).



%MYTRANSFUN
myTransFun(TransList,CharsList,StatesList) ->
fun(PID,Char) ->
        Value = lists:member(Char,CharsList),
        if
        (Value == false) -> none;
true ->lists:nth(position(Char,CharsList),lists:nth(position(PID,StatesList),TransList))
        end
    end.




%FIRSTLIST2SECONDLIST restituisce una funzione che dato un elemento della prima lista restituisce quello della seconda nella stessa posizione
firstList2secondlist([One|Ones],[Two|Twos]) ->
fun(Elem)-> if
(Elem == One)  -> Two;
true             -> F = firstList2secondlist(Ones,Twos), F(Elem)
end
end.


%TRANSFUN2TRANSFUNPIDS ci dice in che stato passare
transFun2transFunPIDS(TransFun,PIDSList,StatesList) ->
fun(PID,Char) ->
State2pid = firstList2secondlist(StatesList,PIDSList),
Pid2state = firstList2secondlist(PIDSList,StatesList),
        Value = TransFun(Pid2state(PID),Char),
        if
        (Value == none) -> none;
        true -> State2pid(Value)
        end
end.



%CREATE crea l'automa
create(StatesList,TransFun,FinalFun) ->
IDmanager = spawn(regExprGen,manager,[]),
StatesPIDS = [spawn(regExprGen,state,[IDmanager,FinalFun(State)]) || State <- StatesList],
[QInit|_] = StatesPIDS,
TransFunPIDS = transFun2transFunPIDS(TransFun,StatesPIDS,StatesList),
IDmanager!QInit,
[IDQ!TransFunPIDS || IDQ <- StatesPIDS ],
IDmanager.


%MANAGER
manager() -> receive
IDinitial -> loopmanager(IDinitial)
end.



%LOOPMANAGER
loopmanager(IDinitial) -> receive
{requestParsing,ID,List} -> IDinitial ! {List,ID,List};
        {accepted,ID,List}       -> ID ! {accepted,List};
{rejected,ID,List}       -> ID ! {rejected,List}
end,
        loopmanager(IDinitial).



%STATE
state(IDmanager,Final) -> receive
TransFunPIDS -> loop(TransFunPIDS,IDmanager,Final)
end.



%LOOP
loop(TransFunPIDS,IDmanager,Final) -> receive
{[],ID,List}          ->    if
                                    (Final == final)  -> IDmanager ! {accepted,ID,List};
                                         true             -> IDmanager ! {rejected,ID,List}
                                    end;
{[ Char | Cs ],ID,List}  ->  Next = TransFunPIDS(self(),Char),
                                    if
                                    (Next == none)    ->  IDmanager ! {rejected,ID,List};
                                         true             ->  Next ! {Cs,ID,List}
    end
end,
loop(TransFunPIDS,IDmanager,Final).

Se lo volete provare un esempio potrebbe essere quello che segue, basta passare riga per riga quello che c'è dopo all'attore di erlang.

Code:
c(regExprGen).
CharsList = [a,b].
StatesList = [0,1,2,3,4].
TransList = [[1,2],[none,4],[none,3],[3,none],[none,1]].
FinalList = [notfinal,final,notfinal,final,notfinal].
FinalFun = regExprGen:firstList2secondlist(StatesList,FinalList).
TransFun = regExprGen:myTransFun(TransList,CharsList,StatesList).
ID = regExprGen:create(StatesList,TransFun,FinalFun).
ID!{requestParsing,self(),[a,b,b,b,b]}.
receive
{X,[a,b,b,b,b]} -> true
end.
X.
ID!{requestParsing,self(),[a,b,c,b,b]}.
receive   
{Y,[a,b,c,b,b]} -> true 
end.
Y.
Logged
Pages: 1 [2]   Go Up
Print
Jump to: