您好我是Prolog的新手,我认为我遇到了变量绑定方面的问题。 我努力工作的问题是this。
这是我到目前为止所提出的:
:- dynamic lecture/1.
%teacherNames(['Paul'],[['Bsc4'],['Bsc1']], [['AI'],['Games Design']]).
teacherNames(['Paul'],['Bsc4'],['AI']).
teacherNames(['Paul'],['Bsc1'],['Games_dev']).
group(['Hsoftware'],['Bsc4'],['15']).
group(['total'],['Bsc1'],['127']).
group(['games'],['Bsc1'],['52']).
group(['software'],['Bsc1'],['35']).
group(['web'],['Bsc1'],['15']).
group(['systems'],['Bsc1'],['25']).
room(['B1041'],['32']).
room(['B2008'],['32']).
room(['A0006'],['140']).
student(['Bill Bloggs'],['s00000123'],['Bsc4']).
student(['Andera Martin'],['s00000100'],['software']).
assignRoom:-
%retract(lecture(TeachersName,TeachersGroup,TeachSubject)),
write('teachers name?'),nl,
read(TeachersName),
%teacherNames(TeachersName),nl,
write('Group for class'),nl,
read(TeachersGroup),
%write('Subject?'),nl,
%read(TeachSubject),
teacherNames(TeachersName,TeachersGroup,TeachSubject),
%GroupName == TeachersGroup,
%group(GroupName,_,_),
write('Choose Stream'),nl,
read(Stream),
write('time period for class'),nl,
read(Period),
group(Stream,_,_),
write('choose room'),nl,
read(Room),
room(Room,_),
%%assertz(lecture(GroupName,Subject)).
asserta(lecture(TeachersName,TeachersGroup,TeachSubject,Period,Room)).
我的问题是,我希望保罗'保罗'只能将AI教授给Bsc4'并且只能教授'Games_dev'到' Bsc1'。 所以在这种情况下,如果我要输入:
assignRoom.
Paul %teachers name
Bsc4 %the group that will be going to the class
Hsoftware %the stream name
1 %the time the class will be on
B1041 %the room the class will be held in
这有效,但如果我尝试放入除这些值以外的任何东西,它就会失败。 我希望它如何发挥作用,如果该集团是“Bsc4'只有Hsoftware才是真的,如果组名是' Bsc1' Hsoftware将是虚假的,而软件,网络等将是真实的,并且适当的值将被限制为演讲。
编辑:
我改变了一些事情,如果我不考虑用户错误(这将用于此示例),我得到的工作会更好。 新代码在this link,我现在遇到的问题是Room变量的绑定..
如果我输入
assignRoom.
Paul.
Bsc1.
web.
1.
A0006.
除了RoomNumber总是以
输出之外,我得到了我想要的结果 lecture(X,C,V,B,N,Y).
Paul %correct
Bsc1 %correct
web %correct
games_dev %correct
1 %correct
B1041 %Should be A0006
所以我现在要问的是如何修复房间号码的绑定。
答案 0 :(得分:0)
我们的想法是应该明确选择房间,所以我的建议是向用户展示他们的选择。 首先,创建一个将打印所有房间的谓词:
print_rooms:- room(N, C),
write(N), write(' - '),write(C), write(', '),
fail.
print_rooms.
其次,在要求用户选择房间之前使用此谓词:
...
write('choose room: '), print_rooms ,nl,
read(Room),
room(Room,_),
...
你可以做得更好,更干净,但这可能有效。您必须做的其他事情是不断询问用户房间,直到他/她选择有效的选项。