Выбор сортировки в прологе

Я новичок в Прологе и пытаюсь сделать выбор сортировки. Вот что у меня есть:

ssort([],[]).
ssort([M|S],L):-min(M,L),remove(M,L,N),ssort(S,N).

min(M,[M]).
min(M,[H,T]):-min(N,T),min2(M,H,N).

min2(A,A,B):-less(A,B).
min2(B,A,B):-not(less(A,B)).

less(A,B):-(A<B).

append([],B,B).
append([H|A],B,[H|AB]):-append(A,B,AB).

remove(X,L,N):-append(A,[X|B],L),append(A,B,N).

Но когда я попробую это, например:

ssort(S,[5,3,1]),write(S).

я получил false, что бы я ни пытался. Можете ли вы сказать мне, как я могу на самом деле отсортировать список и получить результат, написанный в S?

2 ответа

Решение

Как хорошо указал @Boris, главная ошибка была в min/2 предикат, потому что ему нужен 3-й параметр, чтобы вернуть элемент min в этом параметре. С небольшими изменениями код выглядит так:

ssort([],[]).
ssort([M1|S],[H|T]):-min(H,T,M1),remove(M1,[H|T],N),ssort(S,N).

min(M,[],M).
min(M,[H|T],M1):-min2(M,H,N),min(N,T,M1).

min2(A,B,A):-less(A,B).
min2(A,B,B):-not(less(A,B)).

less(A,B):-(A<B).

append([],B,B).
append([H|A],B,[H|AB]):-append(A,B,AB).

remove(X,L,N):-append(A,[X|B],L),append(A,B,N).

Пример:

?- ssort(S,[5,3,1]).
S = [1, 3, 5] ;
false.

?- ssort(S,[5,3,1,7]).
S = [1, 3, 5, 7] ;
false.

РЕДАКТИРОВАТЬ:

Как правильно заметил @Will Ness, единственной ошибкой была запятая в min(M,[H,T]) поэтому, изменяя на мин (M,[H|T]), он работает нормально!!!. Я думал, что предикат min/2 работает не очень хорошо, поэтому я изменил его в ответе выше, но в конце концов это не было необходимо.

Вот общий способ, как вы можете по крайней мере локализовать ошибку в вашей программе. Если ваш запрос не удался, просто удалите цели из вашей программы. Если оставшийся фрагмент все еще терпит неудачу, в этом фрагменте должна быть ошибка.

: - op (950, фу, *).
* _.

ssort (_ / *[]* /, []).
ssort (_ / *[M | S]* /, L): -
   мин (_ / *M* /, L),
   * удалить (M, L, N),
   * сортировка (S, N).

мин (М, [М]).
мин (М, [Н, Т]):-
   * мин (Н, Т),
   * мин2(М, Н, Н).? - ssort (S, [5,3,1]).

Поскольку этот фрагмент не работает, ваша оригинальная программа также не будет работать. Вам нужно обобщить что-то в оставшейся части.

Другие вопросы по тегам