如果列表是有序的,则返回true如果列表未排序,则返回列表

时间:2017-01-16 07:28:01

标签: prolog

我想编写一个程序,将列表作为输入,列表是有序返回ture,如果列表没有排序,则对列表进行排序。我编写一个程序,获取列表作为输入,如果此列表是有序的,则返回true,否则返回false(ordered(List))我也写一个程序,接收列表并对其进行排序并返回有序列表作为输出(bubblesort( List,Ordered))但我不能将它们合并在一起编写一个程序,如果列表是有序的,则返回true,否则对列表进行排序。我想了很多,但我不能。请帮我 非常感谢

1 个答案:

答案 0 :(得分:0)

  

例如我想要有序([1,2,3])返回true作为输出并且有序([1,3,2])返回[1,2,3]作为输出

这在Prolog中是不可能的。 Prolog谓词与许多其他语言中的程序不同,它们可以对数据结构进行破坏性更改。在Prolog中,就像许多函数式语言一样,"排序列表"表示以(可能!)不同的顺序计算具有相同元素的 new 列表。

因此,如果你想要一个带有列表的谓词,并且可以"返回"在同一列表的排序版本中,您需要一个带有两个参数的谓词。通常的Prolog方法就是使用sort/2谓词。即使输入"它也能很好地工作。列表已经排序(但请注意,它会删除重复的元素)。

如果你真的想编码"的逻辑,请检查有序列表;如果订购,则保持不变,否则返回已排序的版本",您可以使用现有代码执行此操作:

list_sorted(List, SortedList) :-
    ordered(List),
    SortedList = List.
list_sorted(List, SortedList) :-
    \+ ordered(List),  % the list is not already ordered
    bubblesort(List, SortedList).

(我没有测试你的代码。)