根据用户输入读取和检查 txt 文件中的简单数据库

Read and Check simple database in a txt file according to user-input

我想创建一个代码,prolog 要求用户输入大小并计算以获得下一个输入(例如 Matric ID),并将检查一个简单的 txt 文件中的输入是否包含学生详细信息。所以,基本上它会读取文件,如果 id 在 txt 文件中,那么如果不是 false,则为 true。下面是代码:

main :-
write('How many people? '),
read(N),
integer(N),
N > 0,
N < 5,
length(L, N),
maplist(read_n, L),
write_list(L),
nl,
open('test.txt',read),
check(N).

read_n(N) :-
  write('Enter id: '),
  read(N),
  integer(N), N >= 10**4, N < 10**5. %the id must be size of 5 and integer
  %if not error message

write_list(L) :-
  write_list(L, 1).

write_list([H|T], N) :-
  nl,
  format('You have entered id ~w: ~w', [N, H]),
  N1 is N + 1,
  write_list(T, N1).

check(N):-
   %to read the file and check if the ID is in the file or not.
   open('test.txt',read,Int),
   read_file(Int,N),
    close(Int),
   write('your ID exist', N), nl.
read_file(Stream,[]):-
     at_end_of_stream(Stream).

read_file(Stream,[X|L]):-
     \+  at_end_of_stream(Stream),
     read(Stream,X),
     read_houses(Stream,L).

所以,基本上文件中的数据就是几个大小为5的数字,如下所示:

16288. Luke. V5G. ICT.
16277. Kristin. V2D. EE.
16177. Catrine. V4E. CV.
16256. Mambo. V1A. MECHE.
15914. Armenio. V5H. PE.
12345. Lampe. V3C. PG.

文件中的数据是学生的信息。所以 prolog 将根据 ID 进行检查,最后如果该 ID 存在,它将给出 ID 详细信息的消息。例如:

| ?- main.
Please enter an integer value: 2.
Enter id: 16288.

You have entered id 1: 16288

之后,一条消息如下: 欢迎卢克。你的房间是V5G,你是ICT学生。

类似的东西。那么,如何使用 Prolog 来实现这个功能呢? 另外,检查文件的输出为 false。我尝试了很多阅读、查看、打开文件的方法,但都是徒劳的。 T__T

提前致谢

main 中,您的 check(N) 调用已 N 实例化为整数:

integer(N),
...
open('test.txt', open),          % <--- this looks like an error
check(N).

您还有一个无关的 open/2 电话。我很惊讶这没有产生错误,因为 SWI Prolog 没有 open/2.

在您的 check/1 谓词中,您有:

open('test.txt', read, Int),
read_file(Int, N),
...

根据您的数据,您应该在文本文件中使用 Prolog 术语来构建它。请注意以大写字母开头的字符串周围的单引号,使它们成为 atoms。否则,Prolog 会将它们视为变量。

student(16288, 'Luke', 'V5G', 'ICT').
student(16277, 'Kristin', 'V2D', 'EE').
student(16177, 'Catrine', 'V4E', 'CV').
student(16256, 'Mambo', 'V1A', 'MECHE').
student(15914, 'Armenio', 'V5H', 'PE').
student(12345, 'Lampe', V3C, PG).

在程序开始时将您的文件作为事实查阅。调用文件 students.pl:

:- include('students').

那么您就有了一个学生资料数据库。 main 则变为:

main :-
    write('How many people? '),
    read(N),
    integer(N),
    N > 0,
    N < 5,
    length(Ids, N),
    maplist(read_n, Ids),
    write_list(Ids),
    check_ids(Ids).

check_ids([Id|Ids]) :-
    (   student(Id, Name, Room, Type)
    ->  format('Welcome ~w. Your room is ~w and you are a ~w student.~n', [Name, Room, Type])
    ;   format('Student id ~w was not found.~n', [Id])
    ),
    check_ids(Ids).
check_ids([]).

然后删除 read_file。我会稍微修复 write_list/1 以便它成功并在最后为您完成额外的 nl:

write_list(Ids) :-
    write_list(Ids, 1).

write_list([Id|Ids], N) :-
    format('~nYou have entered id ~w: ~w', [N, Id]),
    N1 is N + 1,
    write_list(Ids, N1).
write_list([], _) :- nl.