Термы - все объекты Пролога (5 видов).
-
Простые термы: переменные, константы (атомы, числа)
-
Составные термы: списки, структуры
-
Атом - текстовая константа. Имя начинается с маленькой буквы и может содержать буквы, цифры, подчеркивание. Тип данных - символьный.
-
Число - целочисленная (Int) или действительная (real) константа.
-
Переменная - переменная. Имя начинается с большой буквы. Может быть именованной и анонимной. Находится в одном из двух состояний: конкретизированная (содержит в себе один из пяти термов - число, атом, другую переменную, список или структуру) и не конкретизированная (содержит все, что угодно).
Конкретизированная:
A = 1
Не конкретизированная:
B(=_)
Анонимная:
_ = 1
_ = a
Лексическое пространство - область видимости переменной. Для именованной переменной лексическое пространство - одно предложение. Для не именованной - момент работы с ней.
-
Список - набор однотипных переменных.
[] - пустой список [1, 2, 3] [один, Два, три], Два = _
Списки делятся на голову и хвост:
[Голова | [Хвост]]
Голова и хвост могут содержать один и более элементов. Хвост должен быть списком.
[1 | 2, 3] [1, 2 | [3]] [1, 2, 3 | []]
-
Структура - структура. Состоит из функтора (имени) и аргументов, расположенных в (). При объявлении новой структуры ее арность (количество аргументов) фиксируется.
структура_1(лекция_1, Тема, часа_2)
Арность равно 3.
Процедуры Пролога являются встроенными и в явном виде отсутствуют.
-
Процедура Проверки запроса на истинность.
-
Процедура сопоставления цели запроса с утверждениями программы.
Правила сопоставления термов:
-
Сопоставление констант дает истину, когда константы тождественны.
1 v 1. false один v один true лекция_1 v лекция1 false
-
Сопоставление неконкретизированной переменной с любым термом всегда дает истину. При этом переменная конкретизируется. Сопоставление двух неконкретизированных переменных связывает их.
A(=_) v [1, 2 | Хвост(=_)] true <= (конкретизация) B(=_) v C(=_) true <=> (связанные переменные)
Если наступает конкретизация одной из связанных переменных, вторая конкретизируется так же.
-
Сопоставление конкретизированной переменной с термом определяется правилами сопоставления термов.
Д(=_) = 2
-
Сопоставление списков:
- Сопоставление арностей списков
- Сопоставление элементов списков по очереди
Пример:
[1, 2, 3] v [Один, 2, Три] TRUE 1) 3 v 3 true 2) 1 v Один(=_) true => (конкретизация) 2 v 2 true 3 v Три(=_) true => (конкретизация)
Пример:
[1, 2, 3] v [Один, 2 | Три1] TRUE 1) 3 v ≥2 true Три1(= [_]) 2) 1 v Один(=_) true => (конкретизация) 2 v 2 true [3] v Три1(= [_]) TRUE 1) 1 v 1 true 2) 3 v _ true => (конкретизация)
-
Сопоставление структур
-
Сопоставление функторов
-
Сопоставление арностей
-
Сопоставление элементов списков по очереди
Пример:
лекция(1, Тема, часа_2) v лекция(N, сопоставления, Время) TRUE 1) лекция v лекция true 2) 3 v 3 true 3) 1 v N(=_) true => (конкретизация) Тема(=_) v сопоставления <= (конкретизация) true часа_2 v Время(=_) true => (конкретизация)
-
Предложение заканчивается точкой (.).
, И
; ИЛИ
< > не равно
Используется для описания аргументов пользовательских структур.
Используется для описания пользовательских структур.
При описании пользовательских структур указывают:
- имя
- арность (неявно)
- типы аргументов, если не описаны в DOMAINS
Область программного кода.
Содержит предложения двух видов:
-
Факт Всегда истина. Состоит из утверждений и заканчивается точкой. Утверждение - структура.
<утверждение>. % факт
-
Правило
В правой части стоит утверждение, в левой - условия, которые проверяются на истинность.
<утверждение1> :- <условие1>, <условие2>. % правило 1
<утверждение1> :- <условие1>; <условие2>. % правило 2
Последовательность проверки утверждений, объединенных лексическим И (,) соответствует обходу вложенных циклов или многоуровневых списков Word.
| 3 |__2__| |
|______________|
Последовательность проверки утверждений, объединенных лексическим ИЛИ (;) соответствует проследовательной записи.
|___3___|
|___2___|
Запрос содержит одну или несколько целей (обычно - структур), объединенных И, ИЛИ. Заканчивается точкой.
<цель1>,<цель2>;<цель3>. % запрос
Если запрос содержит именованные переменные (является конкретным), то ответом будет истина или ложь. В противном случае будут искаться все ответы.
Пример: разработать программу, анализирующую основные виды соединений двухполюсников в схеме.
- Графическая интерпретация
Элемент характеризуется:
- Наименованием
- Обозначением на схеме
- Полюсами подключения
Виды соединения:
- Общий узел
- Звезда (не менее трех элементов)
- Параллельное соединение
- Последовательно соединение
[изображение схемы]
- Формирование исходных данных
Опишем все элементы схемы. Введем пользовательский предикат - структуру вида:
элемента(наименование, обозначение, узел1, узел2)
, гдк первые два аргумента - символьные, а вторые два - целочисленные.
PREDICATES
nondeterm элемент(symbol, symbol, integer, integer)
CLAUSES
элемент(резистор, r1, 1, 2). % факт1
элемент(резистор, r2, 2, 3). % ф2
элемент(конденсатор, с1, 1, 4). % ф3
элемент(конденсатор, с2, 3, 6). % ф4
элемент(источник, r1, и1, 2, 5). % ф5
элемент(лампочка, r1, л1, 4, 5). % ф6
элемент(лампочка, r1, л2, 5, 6). % ф7
элемент(катушка, r1, к1, 4, 5). % ф8
элемент(катушка, r1, к2, 5, 6). % ф9
Тестирование:
GOAL
% 1 тест
элемент(резистор, r2, 2, 3). % запрос1
% есть ли в схеме элемент с наименованием "резистор",
% обозначением "r2", первым узлом 1 и вторым узлом 2?'
Пошаговое выполнение программы:
1) факт1 v запрос1 FALSE
элемент v элемент true
4 v 4 true
резистор v резистор true
r1 v r2 false
2) факт2 v запрос1 TRUE
...
r2 v r2 true
2 v 2 true
3 v 3 true
Ответ - истина.
GOAL
% 2 тест
элемент(резистор, Обрзначение, _, _). % запрос2
% какие обозначения на схеме имеют элементы с наименованием "резистор"?'
Пошаговое выполнение программы:
1) факт1 v запрос2 TRUE
...
Обозначение(=_) v r1 true
<= (конкретизация)
_ v 1 true
_ v 2 true
Получено первое решение.
После нахождения первого решения конкретизация r1 отправляется в стек, переменная Обозначение теряет конкретизацию. Продолжается поиск решений.
Итоговый ответ: два решения (r1, r2).
GOAL
% 3 тест
% запрос 3: <цель1>,<цель2>,<цель3>
элемент(_, Обрзначение1, 4, 5),
элемент(_, Обрзначение2, 4, 5),
Обрзначение1 < > Обрзначение2. % запрос3
% какие обозначения на схеме имеют элементы с узлами подключения 4, 5?'
Пошаговое выполнение программы:
1) факт1 v цель1 FALSE
...
6) факт6 v цель1 TRUE
...
Обозначение1(=_) v л1 true
<= (конкретизация)
% Получено первое решение для цель1.
% Согласно очередности обхода запроса с логическим И (вложенный цикл),
% переходим к цель1 и проверяем, начиная с факт1.
7) факт1 v цель2 FALSE
...
12) факт6 v цель2 TRUE
...
Обозначение2(=_) v л1 true
<= (конкретизация)
% цель1 и цель2 дали истину, теперь проверяется цель3
13) Обозначение1(= л1) < > Обозначение2(= л1) FALSE
% цель3 не выполнена. Переменная Обозначение2 теряет конкретизацию.
% Продолжается поиск решений для цель2.
14) факт7 v цель2 FALSE
...
В итоге получим следующие решения:
Обозначение1 = л1 Обозначение2 = к1
Обозначение1 = к1 Обозначение2 = л1
Определение иерархии правил - от простого к сложному.
- Разработка празила "общий узел"
- разработка частного правила (для конкретного узла с константами)
Логическая модель: должна содержать одно утверждение и одно условие.
Введем новый пользовательский предикат.
PREDICATES
nondetern общий_узел(symbol, symbol, integer).