2015-04-28 74 views
0

我要在Prolog中實現一個名冊管理系統。我遇到了一個類似的問題,即我無法確定它是否實際排序,因爲沒有輸出!這是我的進程調用naive_sort和show_records:從天真的列表輸出Prolog

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(我似乎無法找出,看看它的作品,因爲我沒有得到任何輸出)或在我打電話給naive_sort之後,問題出現在我調用show_records的時候。下面是當我輸入「選擇3」被編號的順序排列輸出名單發生了什麼樣本:

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