[erlang-questions] 2 questions: Guards & Variables
Rick Pettit
<>
Wed Nov 15 22:08:29 CET 2006
On Wed, Nov 15, 2006 at 01:32:15PM +0100, Nils Müllner wrote:
> hi,
> i currently implement depth first search tree for distributed
> fault-tolerance measurement. the enclosed module is just one part.
>
> to run the attached file
> 1. enter sample matrix:
> Matrix = [{a,0.1,pid,[{b,0.1},{c,0.1},{d,0.1}], cur,
> stab},{b,0.1,pid,[{e,0.1},{f,0.1}], cur, stab},{c,0.1,pid,[{g,0.1}],
> cur, stab},{d,0.1,pid,[{h,0.1},{i,0.1}], cur, stab},{e,0.1,pid,[],
> cur, stab},{f,0.1,pid,[], cur, stab},{g,0.1,pid,[], cur,
> stab},{h,0.1,pid,[], cur, stab},{i,0.1,pid,[], cur, stab}].
> 2 compile
> c(dfs_init_matrix).
> 3. run
> dfs_init_matrix:dfs_init_matrix(Matrix).
>
> questions:
> 1. in line 81 (in function rip_neighbours the line Bool =
> lists:member(First, Raw_Neighbours),) i have to assign the desired value
> to variable Bool. if i used it directly in the if following clause i
> get a guard error. why do i have to use this work-araound and why is it
> not possible to directly use
> if
> lists:member(First, Raw_Neighbours) ->
> ...
> as guard?
Functions could introduce side-effects (which are disallowed in erlang guards).
> 2. in the end, everything is correctly assigned into variable
> Return_Value in line 50. but when i return this value, everything gets
> corrupted... why?
No time to answer this atm--sorry.
-Rick
> further information:
> *the tree built can be seen in http://www.mue-tech.com/DFS.png
> *the desired result is written to variable Return_Value and printed
> before crash
> *the matrix has the following structure
> [{Node_Name,Node_Fault_Possibility,Node_PID,[{Neighbours_Name,
> Link_Fault_Possibility},
> more_neighbours],Current_Value,Stable_Value},more_nodes]
> *the function gets a matrix where all current values are arbitrary. to
> run the simulator (super module), this module has to assign the stable
> path (Stable_Value) for each node and finally add the list, in which the
> nodes will be visited by dfs-algorithm (compare:
> http://en.wikipedia.org/wiki/Depth-first_search )
>
> thanks in advance for any help...
>
> kind regards
> nils müllner
> -module(dfs_init_matrix).
> -export([dfs_init_matrix/1]).
> dfs_init_matrix(Matrix)->
> My_Elem = get_elem(a,Matrix),
> {Name, Node_Fault, PID, Neighbours, Current, _} = My_Elem,
> New_My_Elem = {Name, Node_Fault, PID, Neighbours, Current, [root]},
> Rest_Matrix = lists:delete(My_Elem, Matrix),
> Stable_Matrix = [New_My_Elem],
> Path = [root],
> Iterative_List = [root],
> My_Children = get_children(Iterative_List, Matrix, a),
> [Next_Child|Other_Children] = My_Children,
> Receive = do_init(Next_Child, Path, Stable_Matrix, Rest_Matrix, Matrix, Iterative_List, Other_Children),
> Receive.
>
> do_init(My_Name, Path, Stable_Matrix, Rest_Matrix, Matrix, It_List, My_Brothers) ->
> My_Elem = get_elem(My_Name, Matrix),
> {Name, NFP, PID, Nei, Cur, _} = My_Elem,
> New_Path = lists:append(Path,[My_Name]),
> Stable_My_Elem = {Name, NFP, PID, Nei, Cur, New_Path},
> New_Stable_Matrix = lists:append(Stable_Matrix, [Stable_My_Elem]),
> New_Rest_Matrix = lists:delete(My_Elem, Rest_Matrix),
> New_It_List = lists:append(It_List,[My_Name]),
> My_Children = get_children(New_It_List, Matrix, My_Name),
> if
> length(New_Rest_Matrix) > 0 ->
> if
> length(My_Children) > 0 ->
> [Next_Child|Other_Children] = My_Children,
> {New_New_Stable_Matrix, New_New_Rest_Matrix, New_New_It_List} = do_init(Next_Child, New_Path, New_Stable_Matrix, New_Rest_Matrix, Matrix, New_It_List, Other_Children);
> true ->
> New_New_Stable_Matrix = New_Stable_Matrix,
> New_New_Rest_Matrix = New_Rest_Matrix,
> New_New_It_List = New_It_List
> end,
> if
> length(My_Brothers) > 0 ->
> [Next_Brother|Other_Brothers] = My_Brothers,
> {New_New_New_Stable_Matrix, New_New_New_Rest_Matrix, New_New_New_It_List} = do_init(Next_Brother, Path, New_New_Stable_Matrix, New_New_Rest_Matrix, Matrix, New_New_It_List, Other_Brothers);
> true ->
> New_New_New_Stable_Matrix = New_New_Stable_Matrix,
> New_New_New_Rest_Matrix = New_New_Rest_Matrix,
> New_New_New_It_List = New_New_It_List
> end,
> {New_New_New_Stable_Matrix,New_New_New_Rest_Matrix,New_New_New_It_List};
> true ->
> New_New_Stable_Matrix = lists:keysort(1,New_Stable_Matrix),
> Return_Value = {New_It_List, New_New_Stable_Matrix},
> io:format("READ THIS!!!~p~n",[Return_Value]),
> Return_Value
> end.
> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
> get_children(Iterative_List, Matrix, Name)->
> Elem = get_elem(Name,Matrix),
> {_, _, _, Neighbours, _, _} = Elem,
> Raw_Neighbours = raw_neighbours(Neighbours,[]),
> rip_neighbours(Raw_Neighbours,Iterative_List).
> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
> get_elem(Elem, Client_List)->
> [First|Rest] = Client_List,
> {Name, _,_,_,_,_} = First,
> if
> Name == Elem ->
> First;
> true ->
> get_elem(Elem, Rest)
> end.
> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
> raw_neighbours([],Neighbours)->
> Neighbours;
> raw_neighbours(Full_List,Neighbours)->
> [First|Rest] = Full_List,
> {Name,_} = First,
> New_Neighbours = lists:append(Neighbours,[Name]),
> raw_neighbours(Rest,New_Neighbours).
> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
> rip_neighbours(Raw_Neighbours,[])->
> Raw_Neighbours;
> rip_neighbours(Raw_Neighbours,Iterative_List)->
> [First|Rest] = Iterative_List,
> Bool = lists:member(First, Raw_Neighbours),
> if
> First == root ->
> New_Raw_Neighbours = Raw_Neighbours;
> true ->
> if
> Bool ->
> New_Raw_Neighbours = lists:delete(First, Raw_Neighbours);
> true ->
> New_Raw_Neighbours = Raw_Neighbours
> end
> end,
> rip_neighbours(New_Raw_Neighbours,Rest).
> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
> _______________________________________________
> erlang-questions mailing list
>
> http://www.erlang.org/mailman/listinfo/erlang-questions
More information about the erlang-questions
mailing list