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



我想创建一个代码,prolog询问用户输入的大小和计算以获取下一个输入(例如矩阵ID),并将检查输入在一个简单的txt文件中是否包含学生详细信息。所以,基本上它会读取文件,如果 id 在 txt 文件中,那么如果不是假,则为 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来执行此功能?另外,检查文件的输出为假。我已经尝试了很多阅读,查看,打开文件的方法,但一切都是徒劳的。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 术语对其进行构建。请注意以大写字母开头的字符串两边的单引号,以使它们成为原子。否则,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.

相关内容

  • 没有找到相关文章

最新更新