【问题标题】:Prolog rule bindingProlog 规则绑定
【发布时间】:2015-03-18 22:26:09
【问题描述】:

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

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

【问题讨论】:

  • 您对所有数据组件使用列表构造是否有特定原因? 例如,为什么是room(['B1041'],['32']). 而不是room('B1041', 32)?任何单一值都不需要是列表。您只需要一个列表,您需要允许零个、一个或多个元素的灵活性。
  • 老实说,我什至不知道有什么不同,我只是认为这就是语法。
  • 这是基本的 Prolog 语法。在处理这个程序之前,您可能想查看一些介绍性 Prolog 教程或获得一本好的介绍性 Prolog 书。
  • 不幸的是,我的时间真的很短,发现所有这些 Prolog 的东西都非常令人困惑,哈哈
  • 选房的标准是什么?在目前的形式中,只有第一个事实室会被统一。

标签: prolog


【解决方案1】:

这个想法是应该明确选择房间,所以我的建议是向用户展示他们的选择是什么。 首先,创建一个将打印所有房间的谓词:

print_rooms:- room(N, C), 
              write(N), write(' - '),write(C), write(', '),
              fail.
print_rooms.

其次,在要求用户选择房间之前使用这个谓词:

...
write('choose room: '), print_rooms ,nl,
read(Room),
room(Room,_),
...

您可以做得更好、更干净,但这可能会奏效。您必须做的另一件事是不断向用户询问房间,直到他/她选择有效的选项。

【讨论】:

  • 我添加了 link here 但绑定仍然关闭。
  • 那是因为您将教室名称作为变量输入。当程序要求教室时,尝试使用引号作为输入,例如'A0006'
  • 否则你可以去掉facts room的引号,把room的首字母改成小写,比如this room(a0006, 140)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多