我是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))
答案 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
,但它很丑陋且容易出错。