reflectionprologpredicategnu-prolog

How to list all predicates that has an specific atom?


another way to ask the question is:

How I can list all the properties of an atom?

For example:

movie(agora).
director(agora, 'Alejandro Amenabar')
duration(agora, '2h').

so, I will like to receive all the predicates that has agora for argument. In this case it will be: movie, director, duration, with the other parameters ('Alejandro Amenabar', '2h').

I found: this, and this questions, but I couldn't understand well.

I want to have the value of false in the "variable Answer" if PersonInvited doesn't like something about the movie.

My query will be:

answer(Answer, PersonInvited, PersonWhoMadeInvitation, Movie)

Answer: I don't like this director

answer(false, PersonInvited, PersonWhoMadeInvitation, Movie):-
    director(Movie, DirectorName),not(like(PersonInvited,DirectorName)).

The same thing will happen with any property like genre, for example.

Answer: I don't like this genre

answer(false, PersonInvited, PersonWhoMadeInvitation, Movie):-
    genre(Movie, Genre), not(like(PersonInvited,Genre)).

So, I want to generalize this situation, instead of writing repeatedly every feature of every object.


Solution

  • I found two solutions the 2nd is cleaner from my point of view, but they are different.

    Parameters:

    Solution 1:

    filter_predicate(PredName, Arity, ParamValue,PosParam, ListParam):-
        current_predicate(PredName/Arity),
        Arity >= PosParam,
        nth(PosParam, ListParam, ParamValue),
        append([PredName], ListParam, PredList),
        GlobalArity is Arity + 1,
        length(PredList, GlobalArity),
        Predicate =.. PredList,
        Predicate.
    

    Query

    filter_predicate(PredName, Arity, agora, 1, Pm).
    

    Output

    Arity = 2                                                                              
    Pm = [agora,'Alejandro Amenabar']
    PredName = director ? 
    
    yes
    

    Solution2:

    filter_predicate(PredName, Arity, ParamList):-
        current_predicate(PredName/Arity),
        append([PredName], ParamList, PredList), 
        GlobalArity is Arity + 1,
        length(PredList, GlobalArity),
        Predicate =.. PredList,
        Predicate.
    

    Query 1:

    filter_predicate(PredName, Arity, [agora, X]).
    

    Output

    Arity = 2
    PredName = director
    X = 'Alejandro Amenabar' ? 
    

    Query 2:

    filter_predicate(PredName, Arity, [X, 'Alejandro Amenabar']).
    

    Output

    Arity = 2
    PredName = director
    X = agora ?