Question

I've got a rule in my Prolog program called blanket(X,Y) which checks if X is in a certain kind of set of Y which consists of:

  • Y's parents
  • Y's children
  • Y's coparents

I've defined it as follows :

blanket(Y,X) :- different(Y,X),parent(Y,X);child(Y,X);coparent(Y,X).

However, this doesn't work as I expect. It correctly identifies X's parents, children, and coparents (if any) but it lists itself as both a parent and a coparent, which I do not want. Is it possible to set some kind of order, so that the different(Y,X) evaluates first and independently? I tried something like : different(Y,X),(parent(Y,X);child(Y,X);coparent(Y,X))., of course, but that yields a syntax error as I"m still quite unfamiliar with the language.

Any suggestions would be greatly appreciated.

EDIT: Here are the child, different, and coparent relations:

child(X,Y) :- parent(Y,X).

different(X,Y) :- not(X == Y).

coparent(Y,X) :- parent(Y,Z),parent(X,Z).

For completeness.

Was it helpful?

Solution

blanket(Y,X) :- different(Y,X), parent(Y,X).
blanket(Y,X) :- different(Y,X), child(Y,X).
blanket(Y,X) :- different(Y,X), coparent(Y,X).

OTHER TIPS

The problen is your definition of coparent. It is the statement that allows return itself as a valid result.

I suggest you redefine it, by example as:

coparent(Y,X) :- parent(Y,Z),parent(X,Z), X \= Y.

in this way, you can simply:

blanket(Y,X) :-parent(Y,X);child(Y,X);coparent(Y,X).

Of course, you can keep definition of "coparent" and only modify blanket as:

blanket(Y,X) :-parent(Y,X);child(Y,X);(coparent(Y,X), X\=Y).
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top