Search code examples
prologdeclarative-programming

Conjuction of custom constraints


I have defined some custom constraints like that:

constraint(a,something).
constraint(a,something1).
constraint(a,something2).

and i need this logical conjunction of them all as a result. ( if one constraint fails, the result should fail )

result(X) :-
    constraint(X,something),
    constraint(X,something1),
    constraint(X,somethingElse).

I'm looking for a more convenient way to avoid this explicit coding of all constraints.

result(X) :- ????

Solution

  • At some point, you need a predicate somewhere to actually list all the constraints you wish to apply. You could do something like this:

    result(X) :-
        constraints(X, [something, something1, something2]).
    
    constraints(X, [H|T]) :-
        constraint(X, H),
        constraints(X, T).
    constraints(_, []).
    

    This mechanism allows you to generate the constraints dynamically as a list, if desired. You could also have the list of constraints be a fact:

    constraint_list(a, [something, something1, something2]).
    

    And then use that in the result predicate:

    result(X) :-
        constraint_list(X, List),
        constraints(X, List).