Использование повторения для сортировки набора фактов в прологе

T44v1 спросил: 13 октября 2017 в 06:34 в: sorting

У меня есть набор фактов / 2, где первая переменная является идентификатором для набора, а вторая является значением, связанным с идентификатором.
Например:

set(a,2).
set(a,c).
set(a,1).
set(a,a).
set(a,3).
set(a,b).

Мне нужно построить порядок предикатов / 2 (используя оператор повтора), который будет выводить значения определенного набора в их лексикографическом порядке. Например,

?- ordering(a,Output).

Результатом будет в

[1,2,3,a,b,c].

я до сих пор сделал следующий код:

ordering(Input,Output):-    
    findall(X,set(Input,X),List),
    repeat,
    doSort(List)
    sort(List, OrderedList),
    Output = OrderedList. 

Идея в том, что предикат найдет все значения из набора, связанного с определенным входом, и объедините переменную List с ними. Теперь у нас есть несортированный список. Вот часть, в которой я не совсем уверен. Предполагается, что предикат будет продолжать использовать какой-то определенный тип doSort в списке, затем проверить список с помощью sort / 2 и, если он лексикографически упорядочен, объединить его с выходными данными.

Может кто-нибудь уточнить, если я на правильном пути, и если да, то как следует реализовать doSort?

0 ответов