我想创建一个代码,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.