Главная

ПРОЕКТ "ЧЕЛОВЕК. ЗЕМЛЯ. ВСЕЛЕННАЯ"

Инструменты пользователя

Инструменты сайта


project:prolog:otricanie



Отрицание в Прологе

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

border(country,country)

Тот факт, что «Германия и Франция имеют общую границу», можно представить в виде утверждения

border(«France», «Germany»).

Франция с Германией имеют общую границу, так же как и Франция с Испанией, и Франция с Италией.

Шесть утверждений задают все возможные пары четырех выбранных европейских стран:

euro_pair(“France”,”Germany”).
euro_pair(“France”,”Spain”).
euro_pair(“France”,”Italy”).
euro_pair(“Germany”,”Spain”).
euro_pair(“Germany”,”Italy”).
euro_pair(“Spain”,”Italy”).

Утверждения для стран с общей границей выглядят так:

border(“France”,”Germany”).
border(“France”,”Spain”).
border(«France»,«Italy»).

Используя отрицание можно определить, какие из стран не имеют общей границы.

Отрицание предиката border задается при помощи предиката not:

not(border(Country1,Country2)).

Этот предикат выдает все пары не граничащих друг с другом стран.

/* Программа: "Подбор стран, которые не имеют общих границ" */
 
domains
country = symbol
 
predicates
euro_pair(country,country) /* пары стран */
border(country,country) /* пара стран с общей границей */
find_non_border_pair /* пара стран без общей границы */
 
clauses
/* факты - пары для четырёх стран */
euro_pair("France","Germany").
euro_pair("France","Spain").
euro_pair("France","Italy").
euro_pair("Germany","Spain").
euro_pair("Germany","Italy").
euro_pair("Spain","Italy").
 
/* пара стран без общей границы */
border("France","Germany").
border("France","Spain").
border("France","Italy").
 
/* правило - пара стран не имеет общей границы, если существует вообще такая пара и этой пары не в списке пар с общей границей */
find_non_border_pair :- euro_pair(X,Y), not(border(X,Y)), write("No border ",X," with ",Y),nl.
 
goal
find_non_border_pair.

Результат:

No border Germany with Spain
No border Germany with Italy
No border Spain with Italy

При программировании на Прологе отрицания иногда бывают удобны для логического вывода неких фактов из уже имеющихся в базе данных. Использование предиката not в конструкции правила дает возможность ввести в программу элементы логики. Например, вопрос с отрицанием можно использовать для определения того, являются ли соседями две выбранные страны. Предположим, вы хотите знать, граничат ли между собой Германия и Испания. Запрос формулируется так:

find_non_border_pair :- euro_pair("Germany","Spain"), not (border("Germany", "Spain")), write("Germany and Spain without common border."),nl.

Ответом на запрос явится True, так как согласно имеющимся в базе данных фактам, эти страны общей границы не имеют.

Рассмотрим теперь другой запрос:

not (border(«France», «Italy»)).

Ответом на него будет False, так как Франция и Италия соседи.

!!Рекомендуем: Семейная Энциклопедия ЗдоровьяОбучениеКонсультация аналитикаОглавлениеГлавная сайта

Обсуждение

Ваш комментарий:
G S R I H
 
project/prolog/otricanie.txt · Последние изменения: 2012/02/23 11:55 (внешнее изменение)

Вы можете оставить свои комментарии в разделе "Обсуждение".
Рекомендуем оформить подписку на новости данного раздела. Для этого нажмите на кнопку "Подписаться", расположенную справа снизу каждой страницы (знак конверта).


www.work-zilla.com

Индекс цитирования