Prolog,setof的奇怪答案

时间:2019-06-07 14:57:40

标签: prolog

我正在使用在线编译器https://swish.swi-prolog.org/

给出以下事实:

frontier(spain,france).
frontier(spain,portugal).
frontier(portugal,spain).
frontier(france,spain).
frontier(france,italy).
frontier(france,germany).
frontier(france,belgium).
frontier(france,swiztland).
frontier(belgium,netherlands).
frontier(belgium,france).
frontier(belgium,germany).
frontier(netherlands,germany).
frontier(netherlands,belgium).
frontier(germany,netherlands).
frontier(germany,belgium).
frontier(germany,france).
frontier(germany,austria).
frontier(germany,swiztland).
frontier(austria,germany).
frontier(austria,swiztland).
frontier(austria,italy).
frontier(swiztland,austria).
frontier(swiztland,france).
frontier(swiztland,germany).
frontier(swiztland,italy).
frontier(italy,france).
frontier(italy,swiztland).
frontier(italy,austria).

我想获得所有国家,但没有得到重复的国家。

因此,我使用了setof谓词,它避免了重复,如下所示:

 setof(Country, (frontier(Country,_)), Countries).

问题在于,当我执行查询时,我获得了一些迭代:

  
      
  1. [德国,意大利,瑞士]
  2.   
  3. [法国,德国,荷兰]
  4.   
  5. [比利时,德国,意大利,西班牙,瑞士],
  6.   
  7. [奥地利,比利时,法国,荷兰,瑞士]
  8.   
  9. [奥地利,法国,瑞士]
  10.   
  11. [比利时,德国]
  12.   
  13. [西班牙]
  14.   
  15. [法国,葡萄牙]
  16.   
  17. [奥地利,法国,德国,意大利]
  18.   

我不明白为什么,我希望列表Countries向我返回所有国家(没有重复的国家)的列表并进行排序,这就是为什么我在谓词边界的第二个参数中使用匿名变量,因为我不在乎第二个参数,所以只希望第一个参数不重复。

有帮助吗?

0 个答案:

没有答案