3

我有以下一组事实:

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).

但现在我正试图写一条规则来找出琼斯博士和史密斯博士何时同时教学。有任何想法吗?

4

2 回答 2

1

您可以使用自己的函数来扩展此实用程序,方法是:

same_time(X, Y, R) :-
    schedule(X, _, B, _),
    schedule(Y, _, B, _),
    X \= Y,
    R = B.

正如列表中返回的那样,这只是告诉您同时教什么老师XY教什么。BR

并且,如果您只希望在教学计划中同时出现多个教师的时间,您可以简单地删除初始 varsXY,甚至替换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).

这认为作为同一位老师,在同一时间教授不同的科目是一种冲突,因为房间冲突正在用你写的陈述来解决。

问候!

于 2012-12-07T22:00:01.467 回答
-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.' ;
于 2012-12-07T21:55:57.840 回答