Выбор сортировки в прологе
Я новичок в Прологе и пытаюсь сделать выбор сортировки. Вот что у меня есть:
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]).
Поскольку этот фрагмент не работает, ваша оригинальная программа также не будет работать. Вам нужно обобщить что-то в оставшейся части.