Prolog 规则绑定
Prolog rule binding
您好,我是 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)).
我的问题是我希望 'Paul' 只能将 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
所以我现在想问的是如何修改房间号的绑定。
想法是房间应该明确 selected,所以我的建议是向用户展示他们的选择。
首先,创建一个将打印所有房间的谓词:
print_rooms:- room(N, C),
write(N), write(' - '),write(C), write(', '),
fail.
print_rooms.
其次,在询问用户select房间之前使用这个谓词:
...
write('choose room: '), print_rooms ,nl,
read(Room),
room(Room,_),
...
您可以做得更好更干净,但这可能会奏效。您必须做的另一件事是不断询问用户房间,直到 he/she select 一个有效的选项。
您好,我是 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)).
我的问题是我希望 'Paul' 只能将 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
所以我现在想问的是如何修改房间号的绑定。
想法是房间应该明确 selected,所以我的建议是向用户展示他们的选择。 首先,创建一个将打印所有房间的谓词:
print_rooms:- room(N, C),
write(N), write(' - '),write(C), write(', '),
fail.
print_rooms.
其次,在询问用户select房间之前使用这个谓词:
...
write('choose room: '), print_rooms ,nl,
read(Room),
room(Room,_),
...
您可以做得更好更干净,但这可能会奏效。您必须做的另一件事是不断询问用户房间,直到 he/she select 一个有效的选项。