Prolog 中的姐妹谓词重复

问题描述 投票:0回答:1

我需要一个谓词来找到妹妹

sister(X, Y)
- “如果他们有共同的父母
X
Y's
就是
W
姐妹,
X
是女性,而
X
不是
Y
”。

问题是每个“孩子”都有两个父母。因此,我在执行时得到了重复项,我该如何消除它们?

parent(tetiana, olha).
parent(tetiana, bohdan).
parent(mykola, olha).
parent(mykola, bohdan).

parent(maria, alex).
parent(maria, daria).
parent(mykhailo, alex).
parent(mykhailo, daria).

parent(olha, aristarh).
parent(alex, aristarh).

woman(tetiana).
woman(maria).
woman(olha).
woman(daria).

man(mykola).
man(bohdan).
man(mykhailo).
man(aristarh).
man(alex).

sister(X, Y) :-
    parent(W, X),
    parent(W, Y),
    woman(X),
    X \== Y.
   
?-
sister(X, Y).

X = olha,
Y = bohdan
X = olha,
Y = bohdan
X = daria,
Y = alex
X = daria,
Y = alex

我希望看到它:

?-
sister(X, Y).

X = olha,
Y = bohdan
X = daria,
Y = alex
prolog swi-prolog
1个回答
0
投票

您可以使用

setof/3
删除重复项:

sister(X, Y) :-
  setof(X-Y, sister_(X,Y), Sisters),
  member(X-Y, Sisters).

sister_(X, Y) :-
    parent(W, X),
    parent(W, Y),
    woman(X),
    X \== Y.

样品运行:

?- sister(X, Y).
X = daria,
Y = alex ;
X = olha,
Y = bohdan.

?- sister(X, alex).
X = daria.
© www.soinside.com 2019 - 2024. All rights reserved.