Prolog中如何用setof替代findall计算国家边境总长度
Prolog 边境总长度计算 setof 实现方案
前提事实定义
borders(sweden,finland,586). borders(norway,sweden,1619).
实现逻辑说明
setof 和 findall 的核心差异是:setof 会默认对自由变量分组、且自动对结果去重。要对齐原 findall 的收集逻辑,需要对目标中的匿名邻国变量做存在量化标记,避免 setof 按邻国分组返回多组结果。
最终代码实现
circumference(C, Country) :- setof(X, Neighbour^( borders(Country, Neighbour, X) ; borders(Neighbour, Country, X)), Kms), sum_list(Kms, C).
代码说明
- 语法中的
Neighbour^是Prolog的存在量化标记,表示我们不关心邻国的具体取值,所有满足边境条件的长度值都会被收集到同一个列表Kms中 - 如果你需要完全对齐原
findall保留重复记录的逻辑(比如事实中存在同一段边境重复录入的场景),可以把setof替换为bagof,其余语法完全一致
内容的提问来源于stack exchange,提问作者Lucky
相关产品推荐
相关产品推荐

