从一个天真的列表Prolog输出

时间:2015-04-28 16:20:56

标签: sorting prolog output

我将在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(我似乎无法查明它是否有效,因为我没有输出)或问题是我的调用我打电话给naive_sort后的show_records。以下是我输入&#34;选择3&#34;输出按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 个答案:

答案 0 :(得分: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).