Мне было интересно, может ли кто-нибудь помочь мне с этой проблемой: мне нужно заказать список, используя Пролог с ограничивающим логическим программированием, и я должен сделать это более эффективным способом.
Итак основным предикатом, который я определил, является следующий:
order(Xs,Ys) :-
same_length(Xs,Ys), /* To determine the list Ys with the Xs' length */
perm(Xs,Ys), /* Permutation */
ordered(Ys), /* Is Ys ordered? */
! .
Реализация каждого из предыдущих вспомогательных предикатов выглядит следующим образом:
same_length(Xs,Ys) :-
length(Xs,L),
length(Ys,L).
perm([],[]).
perm([X|Xs],Ys) :- elem(X,Ys,Ws), perm(Xs,Ws).
ordered([]).
ordered([_]).
ordered([X,Y|Xs]) :- X =< Y, ordered([Y|Xs]).
elem(X,[X|Ys],Ys).
elem(X,[Y|Ws],[Y|Zs]) :- elem(X,Ws,Zs).
Я доказал созданную мной программу, и она работает! Но я не знаю, можно ли повысить эффективность, и если да, то как я могу это сделать (я читал эту старую ветку здесь). Следует ли мне добавить или изменить какие-либо ограничения?
Спасибо!