从Prolog查询结果中删除重复项(使用Pie的Visual Prolog)

时间:2015-03-28 06:49:15

标签: visual-prolog

我有一个如下所示的家谱:

Dasarath - Kousalya
         |
       Raam         -        Sita
                    |
                Lava, Kusa

我的事实是:

male("Dasarath").
male("Raam").
male("Lava").
male("Kusa").

female("Kousalya").
female("Sita").

child("Raam", "Dasarath").
child("Raam", "Kousalya").
child("Lava", "Raam").
child("Lava", "Sita").
child("Kusa", "Raam").
child("Kusa", "Sita").

我有一条规则来定义父母。

parent(ParentName, ChildName) :- child(ChildName, ParentName).

也有定义父亲和母亲的规则。

father(FatherName, ChildName) :- parent(FatherName, ChildName), male(FatherName).
mother(MotherName, ChildName) :- parent(MotherName, ChildName), female(MotherName).

当我将兄弟的规则定义为

时,问题就出现了
brother(BrotherName, PersonName) :- father(ParentName, BrotherName), father(ParentName, PersonName),
                                      male(BrotherName), not BrotherName = PersonName.

我使用查询

执行它
brother(BrotherName, PersonName)

生成结果

brother(BrotherName, PersonName)
BROTHERNAME = "Lava".
PERSONNAME = "Kusa".

BROTHERNAME = "Kusa".
PERSONNAME = "Lava".

2 Solutions

我被要求只为此查询带来一个结果。我无法搜索正确的问题。如果有解决方案,请提供一个或给我Prolog这样工作的原因。

1 个答案:

答案 0 :(得分:2)

您可以通过比较其名称来省略其中一个结果:

如果两个人都是男性并拥有相同的父亲并且第一个人的姓名大于第二个人的名字,那么两个人就很烦人:

brother(BrotherName, PersonName) :- father(ParentName, BrotherName), father(ParentName, PersonName),
                                      male(BrotherName), BrotherName > PersonName.