:- use_module(library(lists)).

:- meta_predicate( a(0) ).

:- dynamic a/1, b/1, c/1,  d:bd/1, g:c/1, b/0, gflags:flag_define/6.

a(1).
b(1).

test membe,
      meta_expand( lists:membe(X,[X|Y]), Clause )

      returns

      Clause =@=  ( lists:membe(X,[X|Y]) ).

test a,
      meta_expand( ( a(X) :- call(X) ) , Clause )

      returns

      Clause =@=  ( a(X) :- call(X) ).

test b,
      meta_expand( ( a(X) :- b(Y), call(X, Y) ), Clause )

      returns

      Clause =@=  ( a(X) :- b(Y), call(X, Y)  ).

test c,
      meta_expand( ( a(X) :- b(Y), call( Y) ), Clause )

      returns

      Clause =@=  ( a(X) :- b(Y), call(user:Y) ).


test d,
      meta_expand( ( c(X) :- call(X) ) , Clause)

      returns

      Clause =@=  ( c(X) :- call(user:X) ).

test e,
      meta_expand( ( c(X) :- b(Y), call(X, Y) ), Clause )

      returns

      Clause =@=  ( c(X) :- b(Y), call(user:X, Y) ).

test f,
      meta_expand( ( c(X) :- b(Y), call( Y) ), Clause )

      returns
      Clause =@=  ( c(X) :- b(Y), call(user:Y) ).

test g,
      meta_expand( ( a(X) :- b(Y), setof( A, X, L) ), Clause )

      returns
      Clause =@=  ( a(X) :- b(Y), setof( A, X, L) ).

test h,
      meta_expand( ( a(X) :- b(Y), setof( A, call(X), L) ), Clause )

      returns
      Clause =@=  ( a(X) :- b(Y), setof( A, user:call(X), L) ).


test i,
      meta_expand( ( c(X) :- b(Y), setof( A, X, L) ), Clause )

      returns
      Clause =@=   ( c(X) :- b(Y), setof( A, user:X, L) ).

test j,
      meta_expand( ( c(X) :- b(Y), setof( A, call(X), L) ), Clause )

      returns
      Clause =@=   ( c(X) :- b(Y), setof( A, user:call(X), L) ).

test k,
      meta_expand( ( c(X) :- b(Y), setof( A, X, L) ), Clause )

      returns
     Clause =@=   ( c(X) :- b(Y), setof( A, user:X, L) ).

test l,
      meta_expand( ( c(X) :- b(Y), setof( A, call(Y), L) ), Clause )

      returns
      Clause =@=   ( c(X) :- b(Y), setof( A, user:call(Y), L) ).

test m,
      meta_expand( ( a(X) :- b(Y), setof( A, Y, L) ), Clause )

      returns
      Clause =@=   ( a(X) :- b(Y), setof( A, user:Y, L) ).

test n,
      meta_expand( ( a(X) :- b(Y), setof( A, call(X), L) ), Clause )

      returns
      Clause =@=   ( a(X) :- b(Y), setof( A, user:call(X), L) ).


test o,
      meta_expand( ( a(X, L) :- append(X, L) ), Clause )

      returns
      Clause =@=   ( a(X, L) :- lists:append(X, L) ).


test  0,
      meta_expand( ( a:(d:b0(X)) :-
                    g:c(X),
                    d(X),
                    user:hello(X,Y) ), Clause )
      returns
       Clause =@= ( d:b0(X) :-
                 g:c(X),
                 user:d(X), 
                 user:hello(X,Y) ).