大家好我是prolog的新手,我有这样一个列表:(实际上它是我的谓词的输出而不是列表)
P = [1/1, 1/3] ;
P = [1/1, 2/3] ;
P = [1/3, 1/1] ;
P = [1/3, 2/1] ;
P = [2/1, 1/3] ;
P = [2/1, 2/3] ;
P = [2/3, 1/1] ;
P = [2/3, 2/1] ;
我需要删除dublicete术语。例如[1 / 1,2 / 3]和[2 / 3,1 / 1]是相同的,我应该删除其中一个,哪一个不重要,怎么可能我在prolog做那个?提前致谢
注意我了解到findALL应该是一个很好的方法,但仍然不知道答案,请帮助我。
答案 0 :(得分:0)
除非你真的告诉我们你的代码,否则永远不可能给你准确的答案。
我假设您有一个谓词f/1
,以便:
?- f(P).
生成您在上面显示的交互式结果。一个简单的解决方案是更改您的查询:
?- f([X,Y]), X < Y.
这将产生以下结果:
X = 1/3, Y = 1/1 ;
X = 1/3, Y = 2/1 ;
X = 2/3, Y = 1/1 ;
X = 2/3, Y = 2/1 ;
findall/3
不足以解决这种特殊情况,因为您以忽略列表中位置的方式定义了唯一性。在Prolog(以及其他所有)中,[X,Y]和[Y,X]不相等,所以你必须找到一个技巧来让它给你“独特”的结果。