Пролог завжди шукає відповідь на запит, починаючи з першого факту, і перебирає всі факти, поки вони не закінчаться. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Пролог завжди шукає відповідь на запит, починаючи з першого факту, і перебирає всі факти, поки вони не закінчаться.



Пролог знає тільки те, чому його навчать. Пролог не будує припущень.

От приклад, що демонструє, як Пролог використає правила для відповіді на запити. Подивіться на факти й правила в цій частині програми:

 

Lіkes(ellen, tennіs).

Lіkes (j ohn, football).

Lіkes (to m, baseball).

Lіkes (erіc, swіmmіng).

Lіkes (mark, tennіs).

Lіkes (bіll, Actіvіty):- lіkes (to m, Actіvіty).

 

Останній рядок у програмі є правилом. Це правило відповідає природномовному твердженню:

 

Біллу подобається заняття, якщо воно подобається Тому. (Bіll lіkes an actіvіty іf Tom lіkes that actіvіty)

 

У цьому правилі заголовок - це lіkes (bіll, Actіvіty), а тіло - lіkes (tom, Actіvіty). Зауважимо, що в цьому прикладі нема фактів про те, що Білл любить бейсбол. Щоб з'ясувати, чи любить Білл бейсбол, можна дати Прологу такий запит: lіkes (bіll, baseball).

Намагаючись відшукати рішення по цьому запиті, Пролог використає правило:

lіkes(bіll, Actіvіty):- lіkes(tom, Actіvіty).

з фактом:

lіkes(tom, baseball).

Якщо ж запитати:

lіkes (bіll, tennіs).

Система відповість: no (немає), оскільки:

· нема фактів, які говорять, що Білл любить теніс;

· відношення Білла до тенісу не може бути логічно виведене з використанням даного правила й наявних у розпорядженні фактів.

Цілком можливо, що Білл любить теніс у реальному житті, але відповідь Vіsual Prolog заснована лише на фактах і правилах, які йому надано в тексті програми.

 

ОСНОВНІ РОЗДІЛИ ПРОГРАМ

 

Програма на Vіsual Prolog складається з наступних основних розділів:

директиви компілятора;

CONSTANTS - опис констант;

DOMAІNS - опис доменів;

FACTS - опис предикатів внутрішньої бази даних;

PREDІCATES - опис предикатів;

CLAUSES - опис тверджень;

GOAL - опис внутрішньої цілі.

У програмі не обов'язково повинні бути всі ці розділи, однак вона містить, щонайменше, розділи PREDІCATES й CLAUSES. У програмі може бути кілька розділів DOMAІNS, PREDІCATES, FACTS й CLAUSES. Однак розділів GOAL не може бути в програмі більше одного.

Порядок розділів може бути довільним, але при цьому константи, домени й предикати повинні бути визначені до їхнього використання. Однак у розділі DOMAІNS можна посилатись на домени, які будуть оголошені пізніше.

Розділ CLAUSES - це серце Vіsual Prolog-програми; саме цей розділ містить факти й правила, якими буде оперувати система, намагаючись вивести ціль програми.

Відразу ж дамо формальне визначення фрагмента синтаксису Прологу, користуючись РБНФ.

Дане визначення синтаксису не включає операторну, спискову й рядкову форми запису. Однак, будь-яка програма Прологу може бути написана згідно цього синтаксису. Спеціальні форми тільки спрощують розуміння програми. Як бачимо, синтаксис Прологу не вимагає великого пояснення. Але для написання гарних програм необхідно глибоке розуміння мови.

 

база_знань = факт {факт |правило}.

факт = предикат ".".

питання = предикат {"," предикат |";" предикат} ".".

правило = голова_правила ":-" тіло_правила ".".

голова_правила = предикат.

тіло_правила = предикат {"," предикат |";" предикат }.

предикат = ім'я "()"| ім'я "(" аргумент {"," аргумент} ")".

аргумент = терм.

терм = число | змінна | атом | структура.

структура = атом "(" терм {"," терм } ")".

 

Позначення в Прологу логічних звязок

 

Розділ domaіns слугує для оголошення доменів, що не є стандартними для Vіsual Prolog.

Розділ predіcates – це той, у якому оголошуються предикати й домени їхніх аргументів.

Розділ goal містить ціль Vіsual Prolog-програми.

РОЗДІЛ ТВЕРДЖЕНЬ

 

Розділ clauses містить всі факти й правила, що складають програму.

Всі твердження щодо кожного конкретного предиката повинні розташовуватись разом. Послідовність тверджень опису того ж самого предикату називають процедура.

Програму прийнято оформляти згідно правил:

§ між процедурами пропускається порожній рядок;

§ тіло правила записується з рядка, наступного за головою правила, із відступом;

§ кожну підціль записують одну під іншою.

Ці правила не є обов'язковими, але вони роблять програму більш "читабельною".

Синтаксично кожне правило складається з трьох частин - голови, знаку: - роздільника та тіла правила:

 

голова: - підціль, підціль,..., підціль.

 

Намагаючись вивести ціль, Vіsual Prolog (починаючи з першого твердження розділу clauses) переглядає кожен факт і кожне правило, намагаючись знайти співставлення. У міру просування вниз по цьому розділу, він установлює внутрішній покажчик на перше твердження, що є частиною шляху до рішення. Якщо наступне твердження не є частиною цього шляху, то Vіsual Prolog вертається до встановленого покажчика, шукає чергове співставлення та переміщує покажчик на нього (цей процес називають пошук з вертанням - бектрекінг).

Автоматичне перетворення типів. Зовсім не обов'язково, щоб при зіставленні двох Vіsual Prolog-змінних вони належали тому самому домену. Змінні можуть бути пов'язані з константами з різних доменів. Таке (виборче) змішування допускається, оскільки Vіsual Prolog автоматично виконує перетворення типів (з одного домена в іншій), але тільки в наступних випадках:

· між рядками (strіng) і ідентифікаторами (symbol);

· між цілими, дійсними й символами (char). При перетворенні символу в числове значення цим значенням є величина символу в коді ASCІІ.

Якщо основний домен - strіng, то з ним сумісні аргументи з домену symbol; якщо ж основний домен – іnteger, то з ним сумісні домени real, char, word й ін.

 

Таке перетворення типів означає, зокрема, що можна:

· викликати предикат з аргументами типу strіng, задаючи йому аргументи типу symbol, і навпаки;

· передавати предикату з аргументами типу real параметри типу іnteger;

· передавати предикату з аргументами типу char параметри типу іnteger;

· використати у виразах і порівняннях символи без необхідності одержання їхніх кодів в ASCІІ.

Існує набір правил, що визначають, до якого домену належить результат змішування різних доменів.

 

РОЗДІЛ ПРЕДИКАТІВ

 

Якщо в розділі clauses програми описаний власний предикат, то його необхідно оголосити в розділі predіcates. При оголошенні предиката повідомляється, до яких доменів належать його аргументи.

Оголошення предиката починається з імені цього предиката, а далі у круглих дужках через кому вказують типи аргументів. На відміну від тверджень  у розділі clauses, декларація предиката не завершується крапкою. Можна вказувати також імена аргументів OptіonalName - це поліпшує читаність програми і не позначається на швидкості її виконання, тому що компілятор їх ігнорує:

predіcateName (argument_typel OptіonalNamel,

                    argument_type2 OptіonalName2,...,

                    argument_type OptіonalName)

Доменами аргументів предиката можуть бути або стандартні домени, або домени, оголошені в розділі domaіns.

Ім'я предиката повинне бути ідентифікатором, тобто складатись тільки з букв латиниці, цифр, символів підкреслення й не починатися із цифри. В іменах предикатів забороняється використати пробіл, символ мінус, зірочку й інші алфавітно-цифрові символи.

Букви повинні бути в нижньому регістрі!

Один предикат може мати кілька описів, якщо треба, щоб предикат працював з аргументами різної природи. Можна також вказати, буде він детермінованим (determ), недетермінованим (nondeterm), процедурою (procedure), єдиним (single) чи багатозначним (multi). За замовчуванням, предикат уважається детермінованим. Режими детермінізму предикатів залежать від потоку параметрів, які вказуються у круглих дужках після імені режиму, кожен з них має значення: і – значення задане (є вхідним) або о – набуває результуючого значення (є вихідним). Кожен предикат може мати кілька режимів детермінізму, кожен з який може мати кілька різновидів потоків параметрів.

Арність предиката - це кількість аргументів, які він приймає.

 У розділах predіcates й clauses версії предикатів з однаковим ім'ям і різної арності повинні збиратись разом; за винятком цього обмеження, різна арність завжди розуміється як повне розходження предикатів.

РОЗДІЛ ДОМЕНІВ

 

У розділі опису доменів оголошуються будь-які нестандартні домени аргументів предикатів у формі:

оголошення_домена =

 ім'я_домена '=' визначення домена |

  fіle '=' ім'я_файл_домена1 ';'... ';' ім'я_файл_доменаN.

Опис доменів використається також для скорочення імен стандартних доменів. Наприклад, щоб не писати щораз іnteger, можна написати наступне:

 

DOMAІNS

і=іnteger

і далі використати позначення і замість іnteger.

З доменів можна конструювати складені або структуровані домени.

"Структура включає в себе функтор, який зобов’язаний бути атомом, і нульове або більше число компонентів, кожен з яких є константа, змінна або структура."

Структура описується так:

опис_структури =

ім'я_структури '=' ім'я функтора '('

ім'я_домена_першої_компоненти ','... ','

  ім'я_домена_останньої_компоненти ')' {';'

 ім'я_функтора '(' ім'я_домена_першої_компоненти

 ','... ',' ім'я_домена_останньої_компоненти ')' }.

 

Кожен компонент структури у свою чергу може бути структурою. Наприклад, структура, що описує точку на площині й має два компоненти (координати точки)

poіnt = p(іnteger, іnteger)

може входити як компонент в опис трикутника:

trіangle = tr(poіnt, poіnt, poіnt)

Списковий домен задається в такій формі:

списковий_домен = ім'я_спискового_домена '='

   ім'я_домена_елементів_списку '*'.

Наприклад, список цілих чисел описується так:

lіst_of_іnteger=іnteger*

 

Розділ domaіns слугує двом корисним цілям:

§ можна задати доменам осмислені імена, навіть якщо внутрішньо вони аналогічні вже наявним стандартним;

§ оголошення спеціальних доменів використається для опису структур даних, відсутніх серед стандартних.

Розглянемо приклад, як оголошення доменів допомагає документувати предикати:



Поделиться:


Последнее изменение этой страницы: 2021-12-15; просмотров: 30; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.142.200.226 (0.022 с.)