2015-04-28 3 views
0

Я должен внедрить систему управления реестром в Prolog. Я столкнулся с проблемой в своем роде, а именно: я не могу понять, действительно ли это сортировка или нет, потому что никакого выхода не происходит! Вот мой процесс назвать naive_sort и show_records:Вывод из наивного списка списка Пролог

process(3, Roster) :- 
    nl, 
    naive_sort(Roster, Sorted), 
    show_records(Sorted), 
    nl, nl, menu(Roster). 

А вот мой naive_sort:

naive_sort(List,Sorted):-perm(List,Sorted),is_sorted(Sorted). 

is_sorted([]). 
is_sorted([_]). 
is_sorted([X,Y|T]):-X=<Y,is_sorted([Y|T]). 

perm([], []). 
perm([X | Y], Z) :- perm(Y, W), remove_list(X, Z, W). 

Мой remove_list отлично работает, я могу легко удалить любой студент по имени или ID. Поэтому я не верю, что в этом есть проблема. Вот мои show_records:

show_records(Roster) :- 
    Roster = [ID | Name], 
    write('\tID = '), 
    ID = [Grade | D], 
    write(Grade), 
    write('\tName = '), 
    D = [E | F], 
    format("~s", [E]), 
    write('\tGrade = '), 
    F = [G | _], 
    write(G), 
nl, 
show_records(Name). 

show_records также работает отлично, так что я уверен, проблема либо с моим naive_sort (который я не могу найти, чтобы увидеть, если это работает, потому что я не получаю выход) или проблема связана с моим вызовом show_records после того, как я вызываю naive_sort. Вот пример того, что происходит, когда я вхожу «Выбор 3» для вывода реестра отсортированных по ID:

Class Roster management system 
    ============================== 
     MENU 
    ============================== 
    0. Reset Roster 
    1. Load Roster from file 
    2. Store Roster to file 
    3. Display Roster sorted by ID 
    4. Add student to Roster 
    5. Remove student from Roster 
    6. Exit 
    Enter your choice (followed by ID '.'): 3. 

    Class Roster management system 
    ============================== 
     MENU 
    ============================== 

Если вы можете предложить какие-либо указания относительно того, что я делаю неправильно здесь я действительно ценю это. Спасибо огромное!

ответ

1

Я получил его на работу, мне в значительной степени пришлось изменить мой is_sorted для обработки списков. Вот мой рабочий код.

naive_sort(Roster,Sorted):-perm(Roster,Sorted),is_sorted(Sorted). 

is_sorted([]). 
is_sorted([_]). 
is_sorted([ [X | XT], [Y | YT] | T]) :- X < Y, is_sorted([ [Y | YT] | T]). 

takeout(Item, [Item | L], L). 
takeout(Item, [X | L], [X | L1]) :- takeout(Item, L, L1). 

perm([], []). 
perm([X | Y], Z) :- perm(Y, W), takeout(X, Z, W). 
Смежные вопросы