输出来自一种天真的列表Prolog



我要在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
    ==============================

如果您能就我在这里做错了什么提供任何指导,我将不胜感激。非常感谢!

我让它工作,我几乎只需要改变我的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).

相关内容

最新更新