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?

¿Fue útil?

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 Items. (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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top