# 4. Завдання та порядок виконання > **Джерело завдання.** Умову взято з методичних матеріалів курсу (лабораторна робота > «Створення системи логічних предикатів»). Значення для дерева ви обираєте > **самостійно** (індивідуальний варіант); означення похідних предикатів наведено > **словами й логічними формулами** — **код мовою Prolog пишете самі**. ## Мета завдання Створити генеалогічне дерево у вигляді **системи логічних предикатів** і реалізувати її в [SWISH](https://swish.swi-prolog.org/): описати родину базовими предикатами (факти) та вивести родинні відношення правилами (логічні формули). Оцінка відповідає **найвищому повністю й правильно виконаному рівню**. ## Середовище Виконуйте роботу в онлайн-редакторі **SWISH SWI-Prolog** — (підійде й будь-який інший інтерпретатор Prolog). Нагадування синтаксису — у [2method.md](2method.md). ## Позначення У формулах нижче предикати записано **великими** літерами ($\mathrm{FATHER}(x,y)$), у програмі Prolog ті самі предикати — **малими** (`father(X, Y)`). Змінні у формулах — малі $x, y, z$; у Prolog — великі `X, Y, Z`. Скрізь використано допоміжний предикат $$ \mathrm{PARENT}(x, y) \;\equiv\; \mathrm{FATHER}(x, y) \vee \mathrm{MOTHER}(x, y) \qquad(\text{«}x\text{ — один із батьків }y\text{»}). $$ ## Порядок виконання 1. **Сплануйте дерево.** Намалюйте на папері родину з **трьох поколінь** так, щоб у ній були: щонайменше двоє рідних братів/сестер; пара, що має **двох** дітей (для `parents`); і **дві** сестри/брати, у кожного з яких є власна дитина (для `cousin`). Позначте стать кожної особи. 2. **Опишіть базові предикати (крок 2 нижче)** фактами `man/1`, `woman/1`, `father/2`, `mother/2` з власними значеннями. Це рівень фактів. 3. **Додайте допоміжний `parent/2`** двома правилами (через `father` та `mother`). 4. **Виводьте похідні предикати рівень за рівнем** (кроки 3 → 4 → 5). **Перевіряйте кожен** предикат запитом, перш ніж переходити до наступного. 5. **Зафіксуйте результати** — знімки запитів і відповідей SWISH — для звіту (див. [5report.md](5report.md)). ## Завдання за рівнями ### Рівень 1 — базовий (оцінка 60–74) **Крок 2. Побудова генеалогічного дерева (базові предикати).** Задайте власними значеннями факти: | Предикат | Місність | Зміст | Приклад факту | |---|:--:|---|---| | $\mathrm{MAN}(x)$ | 1 | $x$ — чоловік | `man(ivan).` | | $\mathrm{WOMAN}(x)$ | 1 | $x$ — жінка | `woman(maria).` | | $\mathrm{FATHER}(x, y)$ | 2 | $x$ є батьком $y$ | `father(ivan, petro).` | | $\mathrm{MOTHER}(x, y)$ | 2 | $x$ є матір'ю $y$ | `mother(maria, petro).` | **Крок 3. Похідні предикати (виразити логічними формулами).** Реалізуйте правилами: | Предикат | Зміст | Логічна формула (означення) | |---|---|---| | $\mathrm{BROTHER}(x, y)$ | $x$ — брат $y$ | $\mathrm{MAN}(x) \wedge \exists z\,\big(\mathrm{PARENT}(z, x) \wedge \mathrm{PARENT}(z, y)\big) \wedge x \ne y$ | | $\mathrm{SISTER}(x, y)$ | $x$ — сестра $y$ | $\mathrm{WOMAN}(x) \wedge \exists z\,\big(\mathrm{PARENT}(z, x) \wedge \mathrm{PARENT}(z, y)\big) \wedge x \ne y$ | | $\mathrm{PARENTS}(x, y, z)$ | $x$ та $y$ — батьки $z$ | $\mathrm{FATHER}(x, z) \wedge \mathrm{MOTHER}(y, z)$ | ### Рівень 2 — середній (оцінка 75–89) Виконайте **все з рівня 1** і додатково виведіть логічними формулами: | Предикат | Зміст | Логічна формула (означення) | |---|---|---| | $\mathrm{GRANDFATHER}(x, y)$ | $x$ — дід $y$ | $\exists z\,\big(\mathrm{FATHER}(x, z) \wedge \mathrm{PARENT}(z, y)\big)$ | | $\mathrm{GRANDMOTHER}(x, y)$ | $x$ — баба $y$ | $\exists z\,\big(\mathrm{MOTHER}(x, z) \wedge \mathrm{PARENT}(z, y)\big)$ | *(«Дід $y$» — це батько одного з батьків $y$; змінна $z$ — проміжна особа, батько чи мати $y$.)* ### Рівень 3 — високий (оцінка 90–100) Виконайте **все з рівнів 1–2** і додатково виведіть логічними формулами: | Предикат | Зміст | Логічна формула (означення) | |---|---|---| | $\mathrm{UNCLE}(x, y)$ | $x$ — дядько $y$ | $\exists z\,\big(\mathrm{BROTHER}(x, z) \wedge \mathrm{PARENT}(z, y)\big)$ | | $\mathrm{AUNT}(x, y)$ | $x$ — тітка $y$ | $\exists z\,\big(\mathrm{SISTER}(x, z) \wedge \mathrm{PARENT}(z, y)\big)$ | | $\mathrm{COUSIN}(x, y)$ | $x$ — двоюрідний(-а) брат/сестра $y$ | $\exists a\,\exists b\,\big(\mathrm{PARENT}(a, x) \wedge \mathrm{PARENT}(b, y) \wedge \mathrm{SIBLING}(a, b)\big)$ | де $\mathrm{SIBLING}(a, b) \equiv \exists z\,\big(\mathrm{PARENT}(z, a) \wedge \mathrm{PARENT}(z, b)\big) \wedge a \ne b$ («$a$ і $b$ — рідні брат/сестра»). Тобто **двоюрідні** мають спільного **діда чи бабу**, але **різних** батьків. > **Порада.** Означення вище — **композиції**: «дід» = «батько» ∘ «parent», «дядько» = > «брат» ∘ «parent», «двоюрідні» будуються через `sibling`. Тому реалізовуйте предикати > **знизу вгору**: спочатку `parent`, потім `brother`/`sister`, і лише тоді > `uncle`/`aunt`/`cousin`, які на них спираються. ## Вимоги до перевірки Для **кожного** реалізованого предиката наведіть у звіті **щонайменше один** запит з відповіддю SWISH. Радимо перевірити: - **факти** — напр. `?- father(ivan, petro).` (очікувано `true`); - **предикат з однією змінною** — напр. `?- brother(X, olha).` (перелік усіх братів); - **предикат-перевірку** — напр. `?- grandfather(ivan, andrii).` (`true`/`false`); - **запит без розв'язку** — переконайтеся, що хибне відношення дає `false` (напр. `?- sister(petro, _).`); - **запит із кількома відповідями** — покажіть перебір через `;` і поясніть порядок (backtracking; можливі повтори — див. зауваження в [2method.md](2method.md)). ## Що здавати - **Текст програми** (усі факти й правила) — файл `.pl` або лістинг у звіті; - **звіт** за структурою [5report.md](5report.md) зі **знімками** запитів і відповідей; - **усно** на захисті: пояснити будь-яке своє правило й хід виконання одного запиту. Оцінка = найвищий рівень, виконаний **повністю та правильно** (усі предикати рівня працюють і перевірені запитами).