Пролог Сортировка списка по положению правила - PullRequest
0 голосов
/ 30 ноября 2018

Я новичок в Прологе и для следующей программы:

place(Store,2,a).
place(Store,1,b).
place(Store,3,d).
place(Store,4,c).
placeSort(S,List):- findall(L,place(S,N,L),List).

вывод: List = [a, b, d, c].

Используя placeSort (S, List), я могу найти все элементы (a, b, c, d), который содержит S (Store).

Однако здесь я хочу добиться сортировки позиции a, b, c, d, используя N, однако я не знаю, какчтобы сделать это, используя сортировку, просто отсортируем ее в алфавитном порядке

placeSort(S,NewList):- findall(L,place(S,N,L),List),sort(List,NewList).

вывод: List = [a, b, c, d]. чего я хочу достичь: List = [b,a,d,c]

** Я знаю, используя placeSort(S,NewList):- findall([N,L],place(S,N,L),List),sort(List,NewList).

возвращает список списков, отсортированных по номерам.вывод: List = [[1, b], [2, a], [3, d], [4, c]].

, но я не уверен, как убрать числа и просто взять вместо них алфавиты.

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

SWI-Prolog предлагает интересную встроенную order_by / 2, заполняющую пробел, который испытывает традиционный Prolog по сравнению с SQL, с библиотекой ( последовательность решений ):

?- order_by([asc(X)],place(P,X,W)).
X = 1,
W = b ;
X = 2,
W = a ;
...

Таким образом, вы можете избежать построения полного списка.

0 голосов
/ 30 ноября 2018

Самый простой способ сделать это - использовать setof/3 (который сортирует по термину) и выбрать форму термина, которая подходит вам в вашем роде.В этом случае вы можете собрать условия формы N-X, где они удовлетворяют, place(_, N, X):

setof(N-X, place(S,N,X), OrderedList).  % Assuming `S` is bound

Это приведет к:

OrderedList = [1-b, 2-a, 3-d, 4-c]

Тогда вы можете использовать maplist/3, чтобы получить список, определив простое сопоставление:

foo(_-X, X).
maplist(foo, OrderedList, List).

Это даст вам только те элементы, которые вы хотите.

Ваш полный предикат будет выглядеть так:

foo(_-X, X).

placeSort(S, List) :-
    setof(N-X, place(S,N,X), OrderedList),
    maplist(foo, OrderedList, List).

Очевидно, вы бы выбрали разумные имена для ваших фактов, предикатов и переменных.Мои имена (foo, List, OrderedList, S, N, X), на мой взгляд, недостаточны для приложения, но я не знаком с вашей фактической проблемной областью, поэтомуэто только для иллюстрации.

В качестве отступления, обратите внимание, что в ваших фактах Store - это переменная, так что в фактах это не имеет особого значения.Я сохранил ваше использование S в вашем предикате, но мне неясно, как вы на самом деле собираетесь его использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...