Prolog GNU - Univ operador? Explicación de la misma
-
29-09-2019 - |
Pregunta
Así que el operador Univ. No entiendo exactamente la misma.
Por ejemplo esto:
foo(PredList,[H|_]) :- bar(PredList,H).
foo(PredList,[_|T]) :- foo(PredList,T),!.
bar([H|_],Item) :- G =.. [H,Item],G.
bar([_|T],Item) :- bar(T,Item).
Lo que está haciendo esto? Esto se hace para observar si otro predicado es verdadero. No entiendo lo que el ".." lo hace.
¿Cómo volver a escribir esto sin que el operador Univ?
Solución
Univ (=..
) se rompe hasta un término en una lista de los componentes, o construcciones de un término de la Lista A tales. Proveedores:
?- f(x,y) =.. L.
L = [f, x, y].
?- f(x,y,z) =.. [f|Args].
Args = [x, y, z].
?- Term =.. [g,x,y].
Term = g(x, y).
bar
parece llamar a cada predicado en PredList
en Item
, con retroceso foo
lo largo de los Item
s. (Uso de una variable como un predicado no es portátil;. El predicado call
debe preferirse)
Editar : Kaarel es correcto, Univ pueden ser reemplazados por functor/3
y arg/3
, como sigue:
bar([H|_],Item) :-
functor(Goal,H,1), % unifies Goal with H(_)
arg(1,Goal,Item), % unifies first argument of Goal with Item
call(Goal). % use this for portability
Otros consejos
La reescritura más adecuado en mi opinión sería:
bar( [H|_], Item ) :- call(H, Item).
call/n
todavía no son parte de la norma ISO núcleo, pero podría convertirse en un futuro próximo (*). Una gran cantidad de sistemas Prolog ya se admite.
Hay una razón por la call/n
se prefiere en (=..)/2
simple y soluciones functor/3
+ arg/3
. La solución call/n
es capaz de cierres de asa (**).
Con el simple (=..)/2
y functor/3
+ arg/3
solución uno puede invocar bar/2
únicamente con átomos en el primer argumento lista. Por ejemplo:
p1(1).
p2(2).
?- bar( [p1, p2], 1 ).
Yes
?- bar( [p1, p2], 2 ).
Yes
?- bar( [p1, p2], 3 ).
No
Con los cierres no están restringidos a los átomos, y que podría ahorrar un poco de esfuerzo de codificación. Por ejemplo, podemos hacer lo siguiente directamente:
?- bar( [=(1), =(2)], 1 ).
Yes
?- bar( [=(1), =(2)], 2 ).
Yes
?- bar( [=(1), =(2)], 3 ).
No
Saludos
(*)
Proyecto de Rectificación Técnica 2
http://www.complang.tuwien.ac.at/ulrich / iso-prólogo / dtc2 # llamada
(**)
Que lo inventó ?: call/n
predicados
http://www.complang.tuwien.ac.at/ulrich /Prolog-inedit/naish.html