Я хочу выполнить сортировку вставками, используя правила пролога swi. На данный момент мой код выглядит так:
isort([H|T],Sorted) :- T = [], Sorted = [H|T].
%When there are only two elements
isort([H1,H2|T],[H2,H1|T]) :- H1 > H2, T = [].
isort([H1,H2|T],[H1,H2|T]) :- H1 < H2, T = [].
%More than two elements
isort([H|T],Sorted) :- isort(T,Sorted).
Я пробовал все, но все это приводило меня в тупик и в конечном итоге сбивало меня с толку еще больше. Прямо сейчас, если я запрошу
isort([5,4,3,2,1],L).
он возвращается
L = [1,2].
Я не совсем понимаю, как другие номера не заботятся. Кто-нибудь, пожалуйста, развейте мое замешательство и, возможно, просветите меня, пожалуйста.
isort([H|T],Sorted) :- isort(T,Sorted).
вы никогда ничего не делаете сH
. - person Steven   schedule 20.08.2018T = []
в конце правила равносильно перезаписи головы с[]
вместо T, поэтому ваше второе правило (например) становитсяisort([H1,H2], [H2,H1]) :- H1 > H2.
Очевидно, вам нужно что-то делать с хвостом. - person Daniel Lyons   schedule 20.08.2018isort([5,4,3,2,2],L).
даже не вернет[2,2]
, а просто потерпит неудачу.isort([],L)
тоже не работает. - person Will Ness   schedule 21.08.2018