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 一个有效的选项。