我对Prolog很新,我很难理解我做错了什么。我试图以一个关键字的形式获取用户输入,然后显示它所属的任何类的完整详细信息。
如果我以这种格式course(managing, A, B, C, D, E)
查询,我的代码将显示信息,但是当我尝试简化时,我的代码将无效。
有人可以告诉我如何编辑我的代码,以便它会询问我想要的信息,并且在显示与该课程相关的所有信息之前只需要一个单词的答案吗?
course(
accouting,
acc10707,
day(tuesday),
time(1100, 1250),
prof(ayesha, mujib),
b228
).
course(
managing,
mng10247,
day(thursday),
time(1000, 1150),
prof(brian, morris),
b228
).
course(
communication,
com00207,
day(monday),
time(1000, 1250),
prof(ali, bec),
b727
).
details :-
write('Please enter unit keyword.'),
nl,
read(Name),
course(Name,Code,Day,Time,Prof,Room),
write(Name,Code,Day,Time,Prof,Room).
答案 0 :(得分:2)
使用您提供的代码,我在gnu-prolog版本1.4.4中遇到以下错误:
| ?- details.
Please enter unit keyword.
communication.
uncaught exception: error(existence_error(procedure,write/6),details/0)
问题是什么?
details/0
中的最后一个目标是write(Name,Code,Day,Time,Prof,Room)
。
您无意中尝试使用不存在的write/6
。
将(S)?
使用prolog-toplevel 代替details/0
中的副作用!
让我们定义details_of/2
。它的第一个参数是结构c/6
。
details_of(Details,Course_name) :- Details = c(Course_name,Code,Day,Time,Prof,Room), course(Course_name,Code,Day,Time,Prof,Room).
样品使用:
| ?- details_of(X,communication). X = c(communication,com00207,day(monday),time(1000,1250),prof(ali,bec),b727) yes
快速修复:而不是write/6
使用write/1
和结构c/6
。
将write(Name,Code,Day,Time,Prof,Room)
替换为
write(c(Name,Code,Day,Time,Prof,Room))
。
| ?- details. Please enter unit keyword. communication. c(communication,com00207,day(monday),time(1000,1250),prof(ali,bec),b727) yes