2012-05-25 2 views
2

... 난 어떤 그룹이 있는지 확인해야합니다프롤로그 determinacy - 나는 사실 수 있도록 설정 한 그룹화 사실

fav_fruit(male, young, apple). 
fav_fruit(female, young, bannana). 
fav_fruit(male, old, bannana). 
fav_fruit(female, old, apple). 
fav_fruit(female, young, apple). 

(성별, 나이) 많은 사람이 좋아하는 과일이있는 곳 (위의 사실에 대한 대답은 (여성, 젊은.)

내가 알아 내려고 시도한 것은 .... 같은 종류의 목록을 반환하는 프롤로그에 aggregate 또는 findall 함수를 사용하는 것입니다 ....

female, young = 2 (apple, bannana) 
male, young = 1 (apple) 
male, old = 1 (bannana) 
female, old = 1 (apple) 

... 그런 식으로 각 구성원의 합계를 확인하고 그 값이 1보다 큰지 여부를 테스트 할 수 있습니다.

모든 아이디어를 높이 평가할 수 있습니다. 종류

fav_fruit_class(Gender-Age, List):- 
    findall(Gender-Age, fav_fruit(Gender, Age, _), LGenderAge), 
    sort(LGenderAge, SGenderAge), 
    member(Gender-Age, SGenderAge), 
    findall(Fruit, fav_fruit(Gender, Age, Fruit), List). 

첫 번째 findall은 +

에 대한 것은 클래스 목록 (성별/나이)를 얻는 방법

답변

2

. 두 번째 findall은 각 클래스에 대해 가장 좋아하는 과일 목록을 가져옵니다.

+1

findall/3 + sort/2 -> setof/3 –

+0

@Paulo Moura : 정확하지는 않지만 setall은 빈 결과 집합으로 실패하지만 findall + sort는 실패합니다. – gusbro

+0

그래서? 위의 findall/3 호출이 빈 목록에서 성공하면 sort/2는 물론 빈 목록을 제공하고 빈 목록에 요소가 없으므로 member/2에 대한 호출이 실패합니다. 따라서 findall/3 + sort/2 호출을 setof/3 호출로 바꿀 수 있습니다. –