Prolog中sister谓词查询结果重复问题及去重需求
解决Prolog中
sister/2谓词的重复结果问题 当前定义的sister(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
解决方案
方法一:修改sister/2谓词,确保仅匹配一次
通过setof/3确认存在至少一位共同父母,避免因多个父母生成重复结果:
sister(X, Y) :- woman(X), X \== Y, % 确认存在至少一个共同父母W,忽略具体的W集合 setof(W, (parent(W, X), parent(W, Y)), _).
修改后直接查询sister(X,Y)即可得到去重后的结果。
方法二:查询时使用去重指令(SWI-Prolog)
如果你使用的是SWI-Prolog,可以直接用distinct/1包装查询,无需修改原谓词:
?- distinct(sister(X, Y)).
方法三:通过findall/3和sort/2手动去重
利用findall收集所有结果,再排序去重后遍历:
?- findall(X-Y, sister(X,Y), Pairs), sort(Pairs, UniquePairs), member(X-Y, UniquePairs).
内容的提问来源于stack exchange,提问作者bebraed
相关产品推荐
相关产品推荐

