Search code examples
prologlogicmeta-predicate

Reverse lookup in Prolog? (how do I find everything that is true about X?)


So, let's say I have the following in a Prolog database:

person(john).
person(mary).
happy(john).

It is clear to that if I want to list all people, I can type:

person(X).

But, what if I want to find all the things that are true about john? I cannot do:

X(john).

But the effect I would like is to be able to put in "john" and get back "person" and "happy".

There is clearly another way I could store my information:

is(person, john).
is(person, mary).
is(happy, john).

And then, I can do:

is(X, john).

But I lose some expressiveness here. I really would like to be able to do something like:

X(john).

Any ideas?

Thanks!


Solution

  • Parameterizing a query over predicates (as in finding ∀x over x(...)) is not usually possible natively in PROLOG, as this sort of thing is a second- (or, higher)-order logic operation, whereas PROLOG is based on first-order logic.

    There are, however, descriptions of how implementations of higher-order logic functions in PROLOG are possible, at least to a limited extent - there are real uses for such functionality. See The Art Of Prolog, Chapter 16, and Higher-order logic programming in Prolog by Lee Naish.