functor(Pred,P,Arity).Usos:
?- functor(papa(juan,juanito),F,N). F = juan, N = 2 ?- functor(Pred,foo,3). Pred = foo(_,_,_). arg(N,Pred,Valor).Usos:
?- arg(2,arbol(6,4,8),X). X = 4 ?- arg(2,arbol(3,X,7),1). X = 1
Ejemplo: substituye un elemento por otro: subst(Old,New,Pred,NPred)
subst(Old,New,Old,New).
subst(Old,New,Otro,Otro) :-
atomic(Otro),
Otr0 \= Old. % o \+ Otro = Old
subst(Old,New,Pred,NPred) :-
functor(Pred,F,N),
functor(NPred,F,N),
subst_aux(N,Old,New,Pred,NPred).
subst_aux(N,Old,New,Pred,NPred) :-
N > 0,
arg(N,Pred,ArgN),
subst(Old,New,ArgN,NArgN),
arg(N,NPred,NArgN),
N1 is N - 1,
subst_aux(N1,Old,New,Pred,NPred).
subst_aux(0,_,_,_,_).
El programa de arriba no toma en cuenta variables. Si tuvieramos variables, entonces hay que cambiar la primera por lo siguiente:
subst(Old,New,Var,Var) :- var(Var), !. subst(Old,New,Viejo,New):- atomic(Viejo), Old = Viejo, !.
``univ'' <=> ``=..'' Pred =.. [F|Args] padre(a,b) =.. [padre,a,b] ?- Meta =.. [foo,a,b,c]. Meta = foo(a,b,c). ?- foo(a,b,c) =.. [P|A]. P = foo, A = [a,b,c]
Con functor y arg o con =.., podemos crear
nuevos predicados.
Podemos definir ``univ'' en términos de ``functor'' y ``arg''.
Si sabemos el predicado y queremos obtener la lista
:
univ(Pred,[F|Args]) :-
functor(Pred,F,N),
args(1,N,Pred,Args).
args(I,N,Pred,[Arg1|Args]) :-
I =< N,
arg(I,Pred,Arg1),
I1 is I + 1,
args(I1,N,Pred,Args).
args(I,N,_,[]):- I > N.
Si sabemos la lista
y queremos obtener el predicado:
univ(Pred,[F|Args]) :-
long(Args,N),
functor(Pred,F,N),
args(Args,Pred,1).
args([Arg1|Args],Pred,N) :-
arg(N,Pred,Arg),
N1 is N + 1,
args(Args,Pred,N1).
args([],_,_).
long([],0).
long([H|T],N) :-
long(T,N1),
N is N1 + 1.
Maplist: tener un predicado que queremos aplicar a una lista de argumentos (asuminedo que el resultado siempre es el último argumento)
maplista(_,[],[]).
maplista(F,[L1|T1],[Res1|ResT]) :-
junta(L1,[Res1],Args), % si es un solo arg. no hace falta
Meta =.. [F|Args],
call(Meta),
maplista(F,T1,ResT).
e.g.,
?- maplista(junta,[[[a,b],[c,d]],[[1,2],[3,4]]],X).
X = [[a,b,c,d],[1,2,3,4]]
?- maplista(quita,[[a,[b,c,a,d]],[1,[2,1,3,4]]],X).
X = [[b,c,d],[2,3,4]]
Para copiar una estructura a otra:
copy(Pred,CPred) :-
copy(Pred,CPred,[],_).
copy(Var1,Var2,Subst,Subst) :-
var(Var1),
v_member(Var1/Var2,Subst),
!.
copy(Var1,Var2,Subst,[Var1/Var2|Subst]) :-
var(Var1), !.
copy(Pred,CPred,Subst1,Subst2) :-
functor(Pred,F,N),
functor(CPred,F,N),
copy_args(N,Pred,CPred,Subst1,Subst2).
copy_args(0,_,_,S,S) :- !.
copy_args(N,Pred,CPred,S1,S3) :-
arg(N,Pred,ArgN),
copy(Arg1,CArg1,S1,S2),
arg(N,CPred,CPredN),
N1 is N - 1,
copy_args(N1,Pred,CPred,S2,S3).
v_member(A/B,[V1/B|_]) :-
A == V1, !.
v_member(X,[_|T]) :-
v_member(X,T).