Sorting Prolog中的元组排序

Sorting Prolog中的元组排序,sorting,prolog,Sorting,Prolog,当我排序时[(101,a),(42,b),(85,b)]是带有排序的Prolog([(101,a),(42,b),(85,b)],X)。是getX=[(42,b),(85,b),(101,a)]。但是为什么呢?Prolog能识别元组并在第一个元素上排序,然后在第二个元素上排序吗?你的假设似乎是合理的。我们可以检查一些文件,我个人喜欢 见第235页,然后见第115页。注意,您还可以按键进行排序 你应该意识到,有些人认为使用这种谓语(非陈述式)是一种错误的做法。基本上,这个谓词中有两个术语,一个必须

当我排序时[(101,a),(42,b),(85,b)]是带有
排序的Prolog([(101,a),(42,b),(85,b)],X)。
是get
X=[(42,b),(85,b),(101,a)]。
但是为什么呢?Prolog能识别元组并在第一个元素上排序,然后在第二个元素上排序吗?

你的假设似乎是合理的。我们可以检查一些文件,我个人喜欢

见第235页,然后见第115页。注意,您还可以按键进行排序


你应该意识到,有些人认为使用这种谓语(非陈述式)是一种错误的做法。基本上,这个谓词中有两个术语,一个必须接地,另一个不能接地,所以实际上这是一个函数,而不是一个逻辑谓词。那些担心逻辑编程的“纯洁性”的人可能会找到一个不使用它的解决办法。

你应该只看一下你正在使用的Prolog的确切文档。例如,在SWI Prolog中,排序基于“标准顺序”。对于复合术语(正如您正在使用的),首先是arity,然后是name,然后是递归参数。所以在你们的例子中,是的,它是先按第一个参数排序,然后按第二个参数排序

顺便说一下,ISO
sort
应该删除重复项,而不是让您感到惊讶

严格来说,Prolog中没有“元组”。这里有一个算符
,带arity 2(或,
,/2
)。看看这个:

2 ?- write_canonical((42, b)).
','(42,b)
true.

非常感谢。为什么说Y是排序中X的排序列表(X,Y)不合逻辑?我的意思是,每个要排序的谓词都需要一个列表和一个输出?或者我错了吗?逻辑是成员(X,Y),所以这两个术语都不需要接地。逻辑谓词在一组变量之间建立一种关系,没有“输入”或“输出”这样的关系,它不用于“排序”,它只确定X和Y具有完全相同的元素,并且Y中的元素被排序(这是它们之间的关系)。至少这是“最纯粹的逻辑编程方法”,其核心是“使用回溯和变量统一进行编程”。即使在像member这样微不足道的事情中,您也无法逃避“回溯和统一”:它将按照member的具体实现所定义的顺序将X与Y的元素统一起来。从这个意义上讲,Prolog从来都不是纯逻辑的,这就是为什么逻辑编程和Prolog通常被分开讨论的原因。我不能认真对待人们避免排序和使用变通方法以确保他们的Prolog程序保持逻辑纯。不是每个谓词都值得为每个可能的实例化模式定义,但是如果您觉得有必要并且有帮助,您当然可以为
sort(-Unsorted,+Sorted)
提供一个实现。未排序列表和已排序列表之间当然存在逻辑上的(如果不是确定性的)关系。顺便说一句,感谢这篇文章,它非常有趣,也是一本很好的读物。不知道这和讨论有什么关系。函子无处不在。。。该死的哈斯克尔,我现在不能停止看到这些东西在我周围。。。它总是在那里,而我是瞎子吗?啊,想到这件事我很头疼,我不能不看…我已经被违背我的意愿永久地改变了,哈斯克尔应该有更严厉的警告…Prolog中的“函子”和哈斯克尔中的“函子”并不是一回事。这里它只是指结构的原子名。在Haskell中,它表示作为
函子
类型类成员的类型(即,支持
fmap
操作的类型)。别担心,Prolog也会永久地改变你。:)+1,只是传递了一个nit:
排序([X,1],[1,1])
成功地执行了
X=1
。因为术语顺序包含变量,所以我们有这样的非逻辑行为。