swi solutions setof length example ejemplo bagof all prolog pattern-matching prolog-findall

solutions - Prolog findall/3



setof prolog (1)

Digamos que tengo un predicado pred que contiene varios hechos.

pred(a, b, c). pred(a, d, f). pred(x, y, z).

¿Puedo usar findall / 3 para obtener una lista de todos los hechos que se pueden emparejar?

por ejemplo, si tengo

pred(a, _, _) Me gustaría obtener

[pred(a, b, c), pred(a, d, f)]


Solo resumiendo lo que dijo @mbratch en la sección de comentarios:

Sí, pero debe asegurarse de usar variables con nombre o construir un predicado auxiliar simple que lo haga por usted:

Variables nombradas

findall(pred(a,X,Y),pred(a,X,Y),List).

Predicado de ayudante:

special_findall(X,List):-findall(X,X,List). ?-special_findall(pred(a,_,_),List). List = [pred(a, b, c), pred(a, d, f)].

Tenga en cuenta que esto no funciona:

findall(pred(a,_,_),pred(a,_,_),List).

Porque es equivalente a

findall(pred(a,A,B),pred(a,C,D),List).

Y, por lo tanto, no unifica las Variables de la Template con las de la Goal .