You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 06:05:06