如何在两个列表中找到相同的元素

时间:2012-12-07 21:46:19

标签: prolog

我有以下几点事实:

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

但现在我正试图写一条规则,以确定琼斯博士和史密斯医生何时同时教书。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

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

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

这只是告诉您教师XY同时教授B的内容,如列表R中所返回的那样。

而且,如果您只想要教学时间表中多个教师共同出现的时间,您只需删除初始变量XY,甚至可以替换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.' ;