Prolog数据库重复

时间:2017-05-23 19:48:24

标签: sql database prolog algebra relational

我是Prolog的新手。我的数据库"由以下规则组成:

teacher(1, 'Benjamin', 'Johnson').
teacher(2, 'Mike', 'Oliver').
teacher(3, 'James', 'Johnson').

school(1, 'School1','Town1').
school(2, 'School2','Town2').
school(3, 'School3','Town3').

group(1,'Group1', 1, 1).
group(2,'Group2', 3, 2).
group(3,'Group3', 2, 1).
group(4,'Group4', 2, 1).
group(5,'Group5', 3, 3).
group(6,'Group6', 1, 3).

"老师"有计划:

teacher(TeacherID, TeacherFirstname, TeacherLastname)

"学校"有计划:

school(SchoolID, SchoolName, City) 

"组"有计划:

group(GroupID, GroupName, TeacherID, SchoolID)

我想输出所有教师姓名为' Johnson'的学校。

我的查询如下:

group( GroupID, _ , TeacherID , SchoolID )  , school( SchoolID , SchoolName, _ ) , teacher( TeacherID , _ , 'Johnson' ).

我想只返回一次符合查询的学校名称。但是,使用我当前的查询,我多次获得一所学校。如何检测重复项而不输出它们?谢谢!

PS:关系代数将是

 π SchoolName (σ TeacherLastname = 'Johnson' (teacher ⨝ group ⨝ school))

1 个答案:

答案 0 :(得分:2)

使用辅助谓词:

school_with_teacher_johnson(School) :-
    group(_, _, Teacher, SchoolID),
    school(SchoolID, School, _),
    teacher(Teacher, _, 'Johnson').

您可以使用setof/3谓词为您提供一组解决方案,即已删除重复项的已排序列表:

?- setof(School, school_with_teacher_johnson(School), Schools).
Schools = ['School1', 'School2', 'School3'].

也可以在没有辅助谓词的情况下使用setof/3,但它很丑陋且容易出错。