我有以下几点事实:
lc('Dr. Smith', 'Algorithms').
lc('Dr. Jones', 'Models & Analysis').
lc('Dr. Smith', 'Operating Systems').
lc('Dr. Jones', 'Artificial Intelligence').
lc('Dr. Smith', 'Models of Computation').
lc('Dr. Smith', 'Discrete Math').
lc('Dr. Jones', 'Information Retrieval').
lc('Dr. Jones', 'Computer Vision').
ctl('Algorithms', 'MWF, 9:00 - 11:00 a.m.', 'McB 209').
ctl('Models & Analysis', 'MWF, 9:00 - 11:00 a.m.', 'McB 211').
ctl('Operating Systems', 'TTH, 9:00 - 11:00 a.m.', 'McB 306').
ctl('Artificial Intelligence', 'TTH, 3:00 - 5:00 p.m.', 'McB 311').
ctl('Models of Computation', 'TTH, 11:00 - 1:00 p.m.', 'McB 204').
ctl('Discrete Math', 'TTH, 3:00 - 5:00 p.m.', 'McB 204').
ctl('Information Retrieval', 'MWF, 3:00 - 5:00 p.m.', 'McB 205').
ctl('Computer Vision', 'MWF, 1:00 - 3:00 p.m.', 'NEB 2182').
我已经能够写下以下内容了,它为我提供了讲师的日程安排:
schedule(Lecturer, X, Y, Z) :- ctl(X, Y, Z), lc(Lecturer, X).
但现在我正试图写一条规则,以确定琼斯博士和史密斯医生何时同时教书。有什么想法吗?
答案 0 :(得分:1)
您可以使用自己的函数来扩展此实用程序:
same_time(X, Y, R) :-
schedule(X, _, B, _),
schedule(Y, _, B, _),
X \= Y,
R = B.
这只是告诉您教师X
和Y
同时教授B
的内容,如列表R
中所返回的那样。
而且,如果您只想要教学时间表中多个教师共同出现的时间,您只需删除初始变量X
和Y
,甚至可以替换R
最终结果本身,如下:
same_time(B) :-
schedule(X, _, B, _),
schedule(Y, _, B, _),
X \= Y.
当不止一位老师上课时,返回仍然是B
的时间。
对于冲突,您可以保留声明中有效的部分,并将其扩展为:
same_teachertime(X) :-
schedule(X, V1, B, _),
schedule(X, V2, B, _),
V1 \= V2.
schedulingconflict(X, Y, X):- ctl(X, A, B), ctl(Y, A, B), X \= Y.
schedulingconflict(_, _, X):- same_teachertime(X).
这认为同一个教师在同一时间教授不同的科目是一种冲突,因为房间冲突正在用你所写的陈述来解决。
问候!
答案 1 :(得分:-1)
_类似的东西:
samehours(Prof1,Prof2,H) :-
Prof1 \= Prof2,
lc(Prof1, Sub1), lc(Prof2,Sub2),
ctl(Sub1,H,_), ctl(Sub2, H, _).
结果:
H = 'MWF, 9:00 - 11:00 a.m.' ;
H = 'TTH, 3:00 - 5:00 p.m.' ;