univ(T, L).
 
univ(T, L). - Преобразование терма T в список L и обратно
 

Определение предиката

univ(Term,[F|Args]) if var(Term), !, length(Args, N), functor(Term, F, N), args1(Args,Term,1).
univ(Term, [F|Args]) if functor(Term, F, N), args(0, N, Term, Args).

args1([Arg|Args], Term, N) if arg(N, Term, Arg), is(N1, plus(N,1)), args1(Args, Term, N1).
args1([ ], Term, N).

args(I, N, Term, [Arg|Args]) if lt(I, N), is(I1,plus(I,1)), arg(I1,Term,Arg), args(I1, N, Term, Args).
args(N, N, Term, [ ]).

 

Примеры

goal: univ(T, L).

зацикливание при неунифицированных переменных!

goal: univ(t(a, b, c, d), L).

L=[t, a, b, c, d]

goal: univ(X, [t, a, b, c, d]).

X=t(a, b, c, d)

goal: univ(t(a, b, c, d), [t, a, b, c, d]).

Нет