Prolog规则绑定

时间:2015-03-18 02:51:17

标签: prolog

您好我是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

所以我现在要问的是如何修复房间号码的绑定。

1 个答案:

答案 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,_),
...

你可以做得更好,更干净,但这可能有效。您必须做的其他事情是不断询问用户房间,直到他/她选择有效的选项。