- Up - | Next >> |
findall/3
The query
findall(Object,Goal,List).
produces a list List
of all the objects Object
that satisfy the goal Goal
. Often Object
is simply a variable, in which case the query can be read as: Give me a list containing all the instantiations of Object
which satisfy Goal
.
Here's an example. Suppose we're working with the above database (that is, with the information about child
and the definition of descend
). Then if we pose the query
findall(X,descend(martha,X),Z).
we are asking for a list Z
containing all the values of X
that satisfy descend(martha,X)
. Prolog will respond
X = _7489
Z = [charlotte,caroline,laura,rose]
But Object
doesn't have to be a variable, it may just contain a variable that is in Goal
. For example, we might decide that we want to build a new predicate fromMartha/1
that is true only of descendants of Martha. We could do this with the query:
findall(fromMartha(X),descend(martha,X),Z).
That is, we are asking for a list Z
containing all the values of fromMartha(X)
that satisfy the goal descend(martha,X)
. Prolog will respond
X = _7616
Z = [fromMartha(charlotte),fromMartha(caroline),
fromMartha(laura),fromMartha(rose)]
Now, what happens, if we ask the following query?
findall(X,descend(mary,X),Z).
There are no solutions for the goal descend(mary,X)
in the knowledge base. So findall
returns an empty list.
Note that the first two arguments of findall
typically have (at least) one variable in common. When using findall
, we normally want to know what solutions Prolog finds for certain variables in the goal, and we tell Prolog which variables in Goal we are interested in by building them into the first argument of findall
.
You might encounter situations, however, where findall
does useful work although the first two arguments don't share any variables. For example, if you are not interested in who exactly is a descendant of Martha, but only in how many descendants Martha has, you can use the follwing query to find out:
?- findall(Y,descend(martha,X),Z), length(Z,N).
- Up - | Next >> |