Упорядочивание списков с программированием логики ограничений

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

Итак основным предикатом, который я определил, является следующий:

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).

Я доказал созданную мной программу, и она работает! Но я не знаю, можно ли повысить эффективность, и если да, то как я могу это сделать (я читал эту старую ветку здесь). Следует ли мне добавить или изменить какие-либо ограничения?

Спасибо!

9
задан Community 23 May 2017 в 10:28
поделиться