если список упорядочен, возвращает true else, если список не упорядочен, отсортируйте список

я хочу написать программу, которая получает список в качестве входных данных и список упорядочен возврат ture и если список не упорядочен сортировать список . я пишу программу, которая получает список в качестве входных данных и возвращает true,если этот список упорядочен, и возвращает false в противном случае ( упорядочен(список) ) также я пишу программу, которая получает список и сортирует его и возвращает упорядоченный список в качестве выходных данных ( bubblesort(список, упорядочен)), но я не могу объединить их вместе, чтобы написать программу, которая, если список упорядочен, возвращает true else сортировать список . я много думаю, но не могу. пожалуйста, помогите мне
большое спасибо

1 ответ

  1. например, I want ordered ([1,2,3]) returns true as output and ordered ([1,3,2]) returns [1,2,3] as output

    Это невозможно в Prolog. Предикаты 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).
    

    (Я не тестировал ваш код.)