2013-04-02 2 views
1

Следующая простая программа Prolog представляет, благодаря использованию структуры данных, семья состоит из мужа, жены и детей списка:Простые данные структуры

family(
    person(bob, smith, date(7,may,1968), 30000), 
    person(ann, smith, date(18,july,1970), 32000), 

    [person(dave, smith, date(1,june,1984), 0), 
    person(edna, smith, date(25,may,1990), 0)] 
). 

family(
    person(mario, rossi, date(7,may,1968), 30000), 
    person(lucia, verdi, date(18,july,1970), 32000), 

    [person(luca, rossi, date(1,june,1984), 0), 
    person(maria, rossi, date(25,may,1990), 0), 
    person(paolo, rossi, data(16, april, 1980), 10000)] 
). 

family(
    person(carlo, bianchi, date(7,may,1968), 30000), 
    person(flavia, blabla, date(18,july,1970), 32000), 

    [person(figlio1, bianchi, date(1,june,1984), 0), 
    person(figlio2, bianchi, date(25,may,2001), 0), 
    person(figlio3, bianchi, data(16, april, 1980), 10000), 
    person(figlio4, bianchi, data(10, april, 1978), 20000)] 
). 

family(
    person(no, no, date(7,may,1968), 30000), 
    person(no, no, date(18,july,1970), 32000), 
    [] 
). 


/* Regola che mostra i mariti: */ 
husband(X) :- family(X,_,_). 

/* Regola che mostra l mogli: */ 
wife(X) :- family(_,X,_). 

/* Regola che mostra i figli: 
    X è figlio se in una famiglia c'è una lista di figli e se X appartiene 
    alla lista dei figli: */ 
child(X) :- family(_,_,Children), 
     member(X,Children). 

Это очень просто. По некоторым фактам я представляю некоторую семью, и у меня есть какое-то правило для выполнения какого-либо запроса (для получения мужей, жен, если Х является ребенком в семье, если человек существует в семье, зарплата человека и дата о рождении человека)

Хорошо, до сих пор у меня нет проблем.

Тогда я следующее упражнение, связанные с предыдущей программой: Написать правило, чтобы получить все семьи, которые не имеют ребенка

Моя идея в том, что семья не имеет ни одного ребенка, если список детей пустой список. Получить семью, не ребенок значит показать муж и жена имена этих семей и я решаю, что добавление этого правила к предыдущей программе:

nochildren(X,Y) :- family(X,Y,[]). 

Это работает, но я не знаю, если это чистое решение потому что пользователь (выполняющий запрос в оболочке Prolog) должен знать, что X представляет имя мужа и что Y представляет имя жены.

Есть ли лучшие решения?

+0

@reinierpost: Почему это лучшее название? – false

+0

@false: это, по крайней мере, несколько специфично. настоящий заголовок может означать почти что угодно в программировании. – reinierpost

+0

@reinierpost: Он не имел абсолютно никакого отношения к содержанию сообщения. – false

ответ

2

Вы поднимаете общий общий вопрос об условных обозначениях для предикатов Пролога. Хорошим правилом является использование имени, которое дает , что и аргументы. Например, если первый аргумент является муж, а вторая его жена, отправной точкой для имени предиката может быть:

husband_wife(X, Y) :- ...

Однако в вашем случае, имя должно также ясно, что конкретный Кроме того, свойство принадлежит, а именно, что у пары нет детей. Как насчет:

childless_husband_wife(X, Y) :- ...

Кажется, достаточно ясно для меня.

Вы можете задать вопрос о: family/3. На мой взгляд, гораздо лучшее имя будет husband_wife_children/3, так как он ясно показывает, каковы его аргументы. Мы в конечном итоге с:

childless_husband_wife(H, W) :- husband_wife_children(H, W, []).

+0

ОК, tnx столько ... только последнее объяснение. Если пользователь (выполняющий запрос) не имеет доступа к исходному коду программы Prolog, как он может узнать список и имена аргументов функции (а также имя функций, которые он может использовать для выполнения запроса)? если это возможно – AndreaNobili

+1

Вы можете предоставить их пользователю, например, путем реализации предиката 'help/1', который каким-то образом отображает правила использования вашей программы или, например, путем документирования доступных отношений с предикатом типа' predicate_description/2' которые пользователи могут запрашивать. – mat

1

Вы должны найти баланс между самодокументированием и громоздкостями very_long_predicate_names. IMHO

childless(Husb,Wife):- % a childless family 
    family(Husb,Wife,[]). 

есть примерно правый. То есть мы можем использовать наводящие имена для предикатов, и их аргументы, как самодокументируемую функцию. Замечания также хороши.

Смежные вопросы