2012-05-25 10 views
2

я факт отрегулированы так ...Prolog определенность - группировка факты

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.

Любые идеи были бы весьма благодарны.

ответ

2

Как насчет

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 + сорт получает список классов (Пол/Возраст). Второй findall получает список любимых фруктов для каждого класса.

+1

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

+0

@Paulo Moura: Не совсем, setof терпит неудачу с пустым набором результатов, тогда как findall + sort не делает. – gusbro

+0

Итак? Если вызов findall/3 выше успешно с пустым списком, sort/2 даст, конечно, также пустой список, а затем вызов члена/2 завершится неудачно, так как в пустом списке нет элементов. Поэтому вы можете заменить вышеперечисленные вызовы findall/3 + sort/2 вызовом setof/3. –