III. Правило сопоставления структур.
Существует правило сопоставления двух структур.
Две структуры сопоставляются, если:
-они имеют один и тот же функтор;
-они имеют одинаковую размерность;
-компоненты на одинаковых позициях обеих структур сопоставляются.
Две компоненты сопоставляются, если:
-обе являются переменными;
-одна из них переменная;
-обе являются структурами и эти структуры сопоставляются
Пример 1.
Будут ли сопоставляться структуры:
оркестр ('струйные', B,C,D) и
оркестр ('струйные', 'духовые', 'ударные', 'клавишные').
Проверяем каждое из трех требований. Обе структуры имеют одинаковый функтор - оркестр и одинаковую размерность 4. Теперь мы должны сопоставить компоненты на одинаковых позициях. Первые компоненты - одинаковые атомы - струнные. При рассмотрении вторых компонент значение - духовые замещает переменную B в первой структуре. Аналогично дело обстоит и с третьими компонентами. Таким образом, мы можем заключить, что структуры сопоставляются.
Пример 2.
Будут ли сопоставляться структуры:
комплектующие (станок ('патрон'), робот ('захватное устройство'))
комплектующие (Оборудование, Оборудование)
Обе структуры имеют один и тот же функтор комплектующие и одну и ту же размерность 2. Теперь проверим, сопоставляются ли элементы на одинаковых позициях. Для первых компонент имеем: структура станок('патрон') сопоставляется с переменной "Оборудование", при этом значение станок('патрон') замещает переменную "Оборудование". Для вторых компонент имеем структура робот ('захватное устройство') должна быть сопоставима с переменной "Оборудование", т.е. заместить переменную "Оборудование". Однако в Прологе переменная в одной структуре может иметь лишь единственное значение. Поэтому невозможно осуществить подстановку различных значений на место одной и той же переменной в одной структуре. Таким образом, эти две структуры несопоставимы.
IV. Рекурсия в структурах.
Представим, что существует военнослужащий, имеющий звание генерал и фамилию Рядовой. Существование военнослужащего с такой фамилией может быть описано с помощью следующего факта:
Военный (‘рядовой’, ’генерал’).
Если мы захотим задать вопрос:
“Кто служит в данном, воинском подразделении и какое звание у этого военнослужащего?”,
мы должны будем сформулировать вопрос в следующем виде:
?-военный (А, В).
Для генерала Рядового ответом на него будет:
А = Рядовой
В = генерал
При таком ответе может возникнуть вопрос, где же фамилия военнослужащего. Можно предотвратить возникновение этого затруднения путем представления фамилии и звания с помощью структур, функторы которых поясняют смысл этих компонентов. Для представления фамилии военнослужащего выберем структуру с функтором фамилия и размерностью 1, а для представления звания структуру с функтором звание такой же размерности. Теперь мы можем дать сведения о военнослужащем в виде такого факта:
военный (фамилия (‘Рядовой’), звание(‘генерал’)).
при ответе на вопрос:
?- военный (А, В).
Пролог выдаст более корректный ответ:
A= фамилия (‘Рядовой’)
В = звание (‘генерал’)
Перепишем нашу программу, так как это было предложено для генерала Рядового:
военный (фамилия ('Павлов'), звание ('генерал')).
военный (фамилия ('Климов'), звание ('полковник')).
военный (фамилия ('Максимов'), звание ('полковник')).
военный (фамилия ('Тихонов') звание ('сержант')).
военный (фамилия ('Николаев'), звание ('сержант')).
военный (фамилия ('Абрамов'), ' звание (капитан ')).
военный (фамилия ('Дмитриев') звание ('лейтенант')).
военный (фамилия ('Федоров'), звание ('капитан')).
военный (фамилия ('Дарьин'), звание ( ‘майор')).