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

时间:2015-04-10 11:47:53

标签: io prolog 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

提前致谢

1 个答案:

答案 0 :(得分:0)

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.