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
.