如何在这种特殊情况下使用缩进删除重复?

时间:2012-04-17 19:14:28

标签: database prolog prolog-setof

    %Examples:
    %days([saturday,sunday,monday,tuesday,wednesday,thursday]).
    %slots([1,2,3,4,5]).
    %course_meetings(csen402,tutorial,t07,nehal,'tutorial for t07').
    %course_meetings(comm401,lecture,all_group_4,dr_amr_talaat,'lecture 1')
%tutorialrooms([c6301,b4108,c2201,c2301,c2202,c2203]).



        day_tut(Day,Slot,Place,Course,Group,Instructor,Descr):-
            days(X),member(Day,X),
            tutorialrooms(X1),member(Place,X1),
            course_meetings(Course,tutorial,Group,Instructor,Descr),
            slots(X2),member(Slot,X2),
            assert(day(Day,Slot,tutorial,Place,Course,Group,Instructor,Descr)).

我想在断言之后找到一种方法来删除某些事实 每天(每天)事实必须每天只有一个房间和插槽 例如:我们可以拥有day(sat,1,_,c6301,_,_,_,_)和                      day(sat,1,_,c6302,_,_,_,_)但我们不能拥有 另一次出现day(sat,1,_,c6301,_,_,_,_)

1 个答案:

答案 0 :(得分:2)

如果您只想删除Goal的冗余解决方案 - 这可能意味着删除重复内容 - 只需将Goal替换为setof(t,Goal,_)即可。只要Goal只有Goal的地面解决方案并且只要{{1}}普遍终止,这种方法就有效。因此,不需要任何数据库操作来删除冗余解决方案。

?- member(X, [a,b,a,c]).
X = a ;
X = b ;
X = a ; % redundant!
X = c.

?- setof(t,member(X, [a,b,a,c]),_).
X = a ;
X = b ;
X = c.