Search code examples
prologaggregate-functions

Prolog count the number of times a predicate is true


I want to count the number of times a custom predicate is true. For example, I have the following code:

is_man(john).
is_man(alex).
?:-is_man(X).

X will return john, then if I press semicolon it will also return alex, then false.

I want to build something like:

count(is_man(X), Count).

And this to return

Count = 2

How can I do that?


Solution

  • In SWI-Prolog:

    aggregate_all(count, is_man(X), Count).
    

    NB. the first argument count is one of the special templates:

    The Template values count, sum(X), max(X), min(X), max(X,W) and min(X,W) are processed incrementally rather than using findall/3 and run in constant memory.