2017-05-23 3 views
0

나는 프롤로그를 처음 사용했습니다. 내 "데이터베이스"는 다음과 같은 규칙으로 구성프롤로그 데이터베이스 이중화

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 : 당신이 솔루션 세트를 제공하여

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

당신은 setof/3 술어를 사용할 수 있습니다, 즉, 정렬 된 목록 : 관계형 대수는 보조 술어와

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

검색어의 목적은 무엇입니까? 반복되는 결과는 주어진 솔루션이 둘 이상의 방식으로 쿼리를 만족함을 의미합니다. – lurker

+0

저는 선생님이 성 (성)이 "Johnson"인 모든 학교의 이름을 알고 싶습니다. 동일한 학교를 두 번이나 입학 할 필요는 없습니다. 내가 뭐라는지 알 겠어? – pmax1

+0

"한 번 여러 번 학교에 다닙니다"는 의미는 무엇입니까? 정확히 쓰십시오 - 여러 결과 튜플을 얻습니다. 그 중 일부는 동일한 학교를 갖습니다. 학교를 원할 경우 학교에 요청하십시오. – philipxy

답변

2

것 중복 된 항목이 삭제되었습니다 :

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

setof/3에는 보조 술어가 없지만 잘못 되더라도 쉽지 않습니다.