1% command to call
    2% mpirun -np 2 swipl italk.pl
    3% only two processes
    4
    5:- use_module(library(lam_mpi)).    6
    7
    8main :-
    9       mpi_init,
   10       mpi_comm_rank(Rank),
   11       do_comm(Rank),
   12       mpi_finalize.
   13
   14do_comm(0) :-
   15	   between(1,10,I),
   16	   NI is I*10,
   17	   gen_list(NI,List),
   18	   mpi_isend(List, 1, I, Handle),
   19	   T =.. [f|List],
   20	   mpi_isend(T, 1, I, Handle2),
   21	   mpi_wait(Handle2, _),
   22	   mpi_wait(Handle, _),
   23	   fail.
   24do_comm(0) :-
   25	   between(1,10,I),
   26	   NI is 2.3*I,
   27	   mpi_send(NI, 1, I),
   28	   fail.
   29do_comm(0).
   30do_comm(1) :-
   31	   between(1,10,I),
   32	   mpi_irecv(0, I, Handle),
   33	   mpi_irecv(0, I, Handle1),
   34	   mpi_wait_recv(Handle1, _, _T),
   35	   mpi_wait_recv(Handle, _, _List),
   36	   writeln(I:_T),
   37	   writeln(I:_List),
   38	   fail.
   39do_comm(1) :-
   40	   between(1,10,I),
   41	   mpi_recv(0, I, T),
   42	   writeln(I:T),
   43	   fail.
   44do_comm(1).
   45
   46gen_list(0,[]) :- !.
   47gen_list(I,[I|List]) :-
   48          I1 is I-1,
   49          gen_list(I1,List).
   50
   51:-main,halt.