我想创建一个代码,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
提前致谢
答案 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.