Жанр: Электронное издание
ПРОЛОГ (Язык программирования).
Статьи.
1. Общие сведения.
2. Краткое описание синтаксиса.
1. ПРОЛОГ
В отличие от подавляющего большинства других языков Пролог (Prolog)
обычно рассматривается в одном контексте с понятием "логическое
программирование". Сторонники этого направления считают, что человек
должен не задавать компьютеру последовательность команд на некоем
ориентированном на компьютер языке, а описывать саму задачу в совершенно
абстрактных логических терминах, не оперирующих определениями "байт" или
"указатель", то есть своего рода создавать модель анализируемой проблемы
и пытаться получить положительные или отрицательные результаты этого
анализа.
У многих людей, знакомых с логическим программированием, обычно
возникают ассоциации с японским проектом компьютеров пятого поколения,
все программное обеспечение которых создавалось на базе Пролога.
Некоторые эксперты считают, что этот проект фактически провалился, и
причиной этому послужили некоторые присущие Прологу функциональные
ограничения.
Строго говоря, Пролог не является языком программирования в чистом виде. С
одной стороны, это оболочка экспертной системы, с другой -
интеллектуальная база данных, что самое важное, не реляционная.
Математическая модель, лежащая в основе Пролога, довольно сложна, и по
мощности системы формирования запросов к базе с этим языком не сравнится
ни одна из коммерческих СУБД.
Фактически Пролог является не процедурным, а декларативным языком.
Человек лишь описывает структуру задачи, а внутренний "мотор" Пролога сам
ищет решение. Более того, здесь вообще не существует понятия
последовательности команд, все это скрыто в математической модели языка.
Хотя, конечно, присутствует небольшой список "линейных" операторов типа
repeat, но он ограничен возможностями использования лишь для конкретных
случаев.
Математическая модель Пролога основана на теории исчисления предикатов,
в частности, на процедурной интерпретации Хорновых дизъюнктов
(содержащих не более одного заключения) Роберта Ковальского из Эдинбурга.
Ее в алгоритмическом, машинно-ориентированном виде, выразил коллега
Ковальского Маартен ван Эмден. Надо сказать, что работы этих ученых из-за
большой сложности их практической реализации на компьютерах (по тем
временам) подвергались большой критике со стороны американских
специалистов по искусственному интеллекту.
Алан Колмероэ, автор языка Пролог, начал работы над полноценной
компьютерной реализацией трудов Ковальского с 1972 года во французском
университете Марсель-Экс. Он составил алгоритм формального способа
интерпретации процесса логического вывода и разработал систему
автоматического доказательства теорем, которая была написана на Фортране.
Она-то и послужила прообразом Пролога. Название его произошло от
Programmation en Loqicue - ЛОГическое ПРОграммирование. Говорят, что
придумала это название жена Алана.
Первое время, в начале 70-х, Пролог был не очень популярен, так же как и
Лисп, он пребывал в некоем забвении, вызванном отсутствием хороших
реализаций, но вскоре появились первые компиляторы с этого языка, в
частности, прекрасная реализация Дэвида Уоррена для компьютера DEC-10 в
Эдинбурге, ставшая своего рода стандартом вплоть до сегодняшнего дня.
Эффективность этой версии заставила специалистов по искусственному
интеллекту по-новому взглянуть на Пролог. В некоторых приложениях,
типичных для Лиспа, таких как обработка списков, Пролог уже не уступал
своему конкуренту, что и послужило в дальнейшем стимулом для ряда
специалистов по логическому программированию к переходу на этот язык.
В качестве типовых данных Пролог использует элементарные единицы
данных, так называемые атомы - строки символов и числа. Из атомов
составляются списки и бинарные деревья. Сама "программа" строится из
последовательности фактов и правил, и затем формулируется утверждение,
которое Пролог будет пытаться доказать с помощью введенных правил.
Таким способом можно описывать очень сложные проблемы, которые будут
решаться самим Прологом автоматически. Это происходит с помощью метода
сопоставления и рекурсивного поиска. Вообще рекурсия играет в Прологе не
меньшую роль, чем в Лиспе, хотя и носит декларативный характер.
Сразу после появления Эдинбургской версии Пролога быстро были успешно
осуществлены различные проекты, ранее казавшиеся очень сложными в
реализации. Появилась возможность создания интеллектуальных
нереляционных баз знаний с иерархической структурой на основе стандартного
механизма с гибкой организацией очень сложных запросов. Были написаны
эффективные программы для решения переборных задач, в частности, из
области молекулярной биологии и проектирования СБИС, где требовалось
учитывать либо сложные внутренние структуры, либо большое число правил,
описывающих организацию объекта. Хорошо зарекомендовал себя Пролог в
качестве экспертной оболочки. А задачи грамматического разбора прямо-таки
просились быть решенными на Прологе. Что весьма характерно, первый
высокопроизводительный компилятор этого языка (Эдинбургская версия) был
написан на самом Прологе. И немудрено, ведь все формальные
синтаксические описания грамматик в Бэкус-форме прекрасно записываются в
терминах Пролога.
Но в силу своей специфичности и сильной ориентированности на встроенные
алгоритмы поиска доказательств Прологу не суждено было воплотиться в
конкретном стандарте, который получил бы массовое признание. На сегодня
имеется стандарт ISO/IEC 13211-1:1995, но он поддерживается далеко не
всеми коммерческими системами, имеющими различные принципы реализации
и цели, для которых планируется использовать эти системы. Фактически
первым и единственным стандартом осталась версия языка, созданная в
Эдинбурге для PDP в 70-х годах. И хотя его поддерживают не все сегодняшние
системы, их разработчики обычно прилагают к своим продуктам препроцессор,
переводящий программу данного диалекта в Эдинбургский вид.
Долгое время среди разработчиков этого языка шла напряженная борьба
между сторонниками оригинальной семантики Пролога и специалистами,
стремившимися пожертвовать ясной структурой языка ради повышения
эффективности реализации. В частности, стала играть роль
последовательность правил в базе данных. Дело в том, что нередко для
получения быстрого ответа оптимально использовать сначала, например,
наиболее простые правила, или наиболее эффективные с точки зрения
человека.
Программа на Прологе постепенно стала приближаться к обычным
процедурным - последовательным языкам. Немалую роль в этом сыграло и
искусственно введенное понятие отсечения, своего рода аналог столь
нелюбимого Дейкстрой goto. Теперь программист мог по своему усмотрению
динамически отсекать бесплодные, по его мнению, ветви деревьев перебора,
что приводило к многократному (на два-три порядка) повышению скорости
работы программ, но при этом сильно нарушалась ясность ее структуры и
возникало множество проблем, связанных с отладкой.
В целях получения высокоэффективных исполняемых модулей были
предприняты попытки написания компиляторов Пролог-программ в Си-код.
Однако, в отличие от процедурных языков сверхвысокого уровня, для Пролога
хорошего результата добиться не удалось. Дело в том, что структура
декларативной "программы" с большим количеством базовых фактов
приводила к появлению крайне неуклюжих конструкций. Например, появлялись
switch-операторы языка Си с более чем 15000 (!) условиями выбора case.
Такие синтаксически корректные выражения многие компиляторы расценивали
как ошибку или выдавали неэффективный код.
К счастью, развитие вычислительной техники в сочетании с уникальной
структурой языка дало свои результаты. При появлении первых параллельных
компьютеров люди, программирующие на Прологе, быстро осознали
пагубность различных "нововведений" типа оператора отсечения, лишавших
язык оригинальной чистоты, и вернулись к первоначальной версии языка.
Пресловутая последовательность правил перестала играть роль, так как
появилась возможность вычислять их параллельно, а в силу того, что
математическая теория Пролога не накладывает никаких требований на
упорядоченность фактов и правил в базе, то скорость работы программы
стала линейно пропорциональной числу процессоров.
Имеются бесплатные версии Пролога для реализаций на параллельных
компьютерах, но они либо усечены до возможности исполнения не более чем
на двух процессорах, либо являются неэффективными. Да и коммерческих
версий не так много, это, например, Densitron CS Prolog для транспьютеров,
или Paralogic. Информации по этим версиям очень мало, и цена их неизвестна.
Она обычно определяется в индивидуальном порядке в зависимости от
конфигурации многопроцессорной системы.
Большинство свободно распространяемых версий Пролога для обычных
однопроцессорных компьютеров сегодня являются или усеченными
подмножествами коммерческих продуктов, или поставляются бесплатно
только для учебных и научных организаций. Кроме того, существует немало
диалектов этого языка, весьма сильно отличающихся от оригинала и
созданных для конкретных целей. Их тоже обычно можно получить даром.
Для примера, приведем SWI-Prolog, содержащий быстрый компилятор,
профилировщик, набор библиотек и удобный интерфейс для подключения Симодулей.
Он реализован для ряда UNIX-платформ, таких как HP, IBM Linux, для
NeXT, OS/2, Sun и Sparc.
Несколько лет назад в Пролог было введено понятие объекта. Появился ряд
объектных диалектов, таких, как freeware-версия OL(P) - Object Layer for Prolog,
простой компилятор объектного кода в обычный Пролог, причем
поддерживаются все принципы ООП, вплоть до множественного
наследования. Не обошлось, конечно, и без коммерческих объектных версий,
не получивших, впрочем, большого успеха из-за появления нового
полудекларативного языка с мощными средствами ООП - Smalltalk.
Из коммерческих реализаций Пролога надо упомянуть одно время бывший
весьма популярным Arity Prolog 6.1 ($650). Delphina Prolog, работающий на
ряде UNIX-платформ, включает в себя высокопроизводительные компилятор и
интерпретатор, интерфейсные библиотеки, и поддерживает Эдинбургский
стандарт. Стоимость его - $10000.
Для Windows (3.x, 95, NT) имеется прекрасная 32-разрядная версия LPA-Prolog
как со "стандартным" синтаксисом, так и с расширенным объектным, набором
библиотек для работы с оконным интерфейсом, поддержкой DDE и ODBCпротокола
и возможностью создания DLL. Цена около $1500.
Ничем не хуже ORISAbase для OS/2. Практически те же возможности,
поддержка API Presentation Manager, SOM, SQL-запросов, графического
интерфейса, объектных расширений и т.д. Стоит этот пакет, правда, подороже
- 100 000 немецких марок.
Знакомый многим программистам TurboProlog, разрабатывавшийся ранее
фирмой Borland, теперь выступает под маркой PDC Prolog и реализован для
DOS, Windows, OS/2 и UNIX. Правда, как недостатки, так и достоинства его
сохранились. Удобная среда разработчика и быстрый компилятор - но
несовместимость с подавляющим большинством других диалектов этого
языка. Есть специальная версия для визуальной разработки VisualProlog.
Едва появившись на свет, Пролог породил множество диалектов, или даже
совсем других языков типа Planner, основанных на декларативных принципах,
но имеющих более узкие области применения. Самому же ему не суждено
было воплотиться в строгом стандарте, скорее всего как раз потому, что
слишком глобальными оказались заложенные в него идеи.
Итак, Пролог свою "лебединую песню" пропел, но как наиболее известный и
наиболее простой в освоении из всех декларативных языков, он остается и
сегодня прекрасным средством для быстрого создания различных экспертных
систем и интеллектуальных баз знаний, требующих сложной структуры
запроса. По сути, хорошая реализация Пролога - это та же CASE-система,
только более простая в изучении и более гибкая в использовании, что
косвенно подтверждается ценами на различные версии этого языка.
Но не ждет ли такая "лебединая" судьба и ряд других, переживающих сегодня
фантастический успех, новых языков программирования (ориентированных, в
частности, на Интернет)? Возможно, скоро мы об этом услышим.
Как ни покажется странным, популярность Пролога продолжает оставаться на
относительно высоком уровне. Причем есть люди, не просто использующие
этот язык в качестве инструмента для прикладных применений, но и
непосредственные разработчики компиляторов для хорошо известных за
рубежом фирм.
В частности, московский программист Анатолий Дедков с 1992 г. работает в
американской компании Paralogic, Inc., занимаясь разработкой и
совершенствованием Пролог-компилятора PTC (Prolog-To-C). Эту версию
отличает такие оригинальная возможность, как компиляция в Си-текст (ANSI
стандарт), что позволяет в итоге получать переносимый и
высокопроизводительный код, а также осуществлять тесную интеграцию с
программами, написанными на Си. Модульная структура PTC снимает ряд
ограничений, нередко возникающих при переводе Пролог-программ на другие
языки. Поддерживается стандартный интерфейс с любыми СУБД через ODBCпротокол,
а также работа с внешними базами данных в индексном формате и
формате двоичных деревьев. Для поддержки графического интерфейса с
пользователем обеспечивается связь с языком Tcl/Tk. Вместе со всеми
инструментальными наборами эта система реализована для UNIX и Windows
NT.
В последнее время в связи с бурным развитием Internet г-н Дедков занимается
добавлением в PTC новых возможностей, связанных в первую очередь с
использованием Пролога в Web-серверах для реализации различных
поисковых механизмов и поддержки запросов к базам данных (БД). Семантика
реализуемые запросы, как к реляционным БД, так и к БД с иерархической и
другой нелинейной структурой, для чего обычно требуется трудоемкое cgiпрограммирование.
При этом возможность компиляции Пролог-программ в
Java-код представляется достаточно перспективным направлением.
К сожалению, в США фактически нет рынка для Пролог-компиляторов. Это
объясняется, по мнению Дедкова, в первую очередь сильной
"раскрученностью" других языков. Интересно, что причиной невысокой
популярности ряда языков программирования, явно обладающих более
мощными и выразительными средствами, таких, как тот же Prolog или Lisp,
Дедков считает их происхождение. В самом деле, прекрасные языки,
разработанные в Европе, известны относительно узкому кругу специалистов,
а наиболее популярны у разработчиков созданные в США. Примеров
действительно более чем достаточно. С американской стороны пришли C,
C++, Fortran, Basic, Cobol, PL/I, а в Европе родились Simula 67, Algol 68, Prolog,
Lisp. Может быть, это объясняется большей практичностью американцев, их
нацеленностью на получение скорейших практических результатов.
В Paralogic Анатолий Дедков также занимается реализацией Пролога для
параллельных компьютеров - n-Parallel Prolog. Эта версия первоначально
создавалась для транспьютеров, но они в США сегодня абсолютно
непопулярны. Лет пять назад в мире произошел определенный всплеск
интереса к транспьютерам, в России было создано несколько СП,
занимавшихся распространением этой техники в нашей стране, но уже в то
время наиболее дальновидные эксперты в частных беседах предсказывали
скорую гибель этого направления. Все упиралось в первую очередь в высокую
трудоемкость (и соответственно стоимость) создания программного
обеспечения для транспьютеров, что так и не позволило занять им даже
небольшую нишу на рынке параллельных систем.
n-Parallel Prolog сегодня реализован для компьютера nCube-2, способен
работать на локальной сети рабочих станций и, по словам Дедкова,
переносимость данной версии на любую другую мультипроцессорную
платформу - дело двух- трех недель.
Троицкая фирма "Анет" по соглашению с компанией Amzi! Inc. распространяет
в России продукт Amzi! Prolog + Logic Server. Он представляет из себя
объектные plug-in компоненты, предназначенные для интегрирования с
различными системами программирования, такими, как Си, Си++, Java, Visual
Basic, Delphi, различные СУБД, электронные таблицы, и т. д. С их помощью
появляется возможность включать в программный код для платформ DOS,
Windows 3.x, Windows 95 и NT обращения к Пролог-системе. Сами Прологкомпоненты
хранятся в специальном репозитории, доступ к которому
осуществляется с помощью API Logic Server, включающего в себя около 50
высокоуровневых функций с интуитивным интерфейсом. Создается Пролог-код
в специальной интегрированной среде разработчика, работающей в среде
Windows. В результате обычный текстовый интерфейс Пролог-систем
заменяется на простые вызовы соответствующих функций с параметрамистроками.
Например, запрос с получением результата в переменной Х
?- WhoIs(X)
X = Компьютер
превращается в следующий вызов функций (на Delphi)
ls.CallPStr(t, 'WhoIs(X)' );
Res := ls.GetPStrArg(t, 1);
ShowMessage( 'Результат ' + Res );
Эта система поддерживает еще довольно много возможностей, в частности,
работу с базами данных через ODBC-интерфейс.
В Санкт-Петербурге есть фирма, ранее называвшаяся "Пролог-Центр", но в
последнее время в связи с возросшим интересом к Прологу укрупнившаяся и
сменившая имя на "Пролог-Софт". Она распространяет в России и странах
СНГ версию Пролога, хорошо известного отечественным разработчикам под
маркой Turbo Prolog 2.0 фирмы Borland, ранее пытавшейся объять необъятное
и выпускавшей компиляторы, наверное, со всех языков программирования.
Нельзя без улыбки вспомнить про ее попытки бороться с фирмой Microsoft на
Basic-рынке со своим прекрасным по тем временам компилятором Turbo Basic.
Знал бы Ф. Кан, какую участь уготовал его коллега Б. Гейтс этому языку.
В дальнейшем все права на Turbo Prolog вернулись к оригинальному
разработчику, датской фирме PDC. С 1990 г. она продала более 300,000 копий
этого продукта и неустанно продолжает его развивать. В России PDC
сотрудничает с вышеупомянутой компанией "Пролог-Софт".
PDC Prolog продается в нескольких версиях за умеренную цену. Он имеется
как в DOS-, так и в Windows-версиях, снабжен визуальными средствами
разработки (Visual Prolog, VIP) и позволяет создавать программы для
платформ DOS, Windows, OS/2. Прилагаются библиотеки поддержки TCP/IP
протокола, доступа к базам данных через ODBC-интерфейс. Также имеется
возможность включения Пролог-подсистемы в программы, написанные на
других языках программирования (примерно как в Amzi! Prolog).
С помощью системы PDC Prolog было создано довольно много крупных
программных комплексов. Для Windows это Visual Prolog, написанный "сам на
себе" путем постепенной "раскрутки", что вообще то для языков
программирования не редкость. Трудоемкость этого проекта оценивается в 30
человеко-лет.
Системы, созданные с помощью продуктов фирмы PDC, применяются в самых
разных сферах. Программные комплексы, написанные на VIP, используются в
ряде авиационных компаниях для управления движением самолетов и
регулирования загрузки авиалиний. Пакет STAFF применяется многими
фирмами, в частности, McDonalds, для оптимальной расстановки персонала.
Было создано несколько систем бух- и складского учета с удаленным
доступом, в которых возможности Пролога позволяют эффективно проводить
различный анализ экономической информации, оптимизировать процессы
учета и хранения продукции и т. д.
Практическое применение сегодняшних реализаций Пролога наглядно
показывает его преимущества в ряде областей перед традиционными
системами программирования. Основное из этих преимуществ - возможность
создания программы в терминах решаемой задачи. Бухучет - вы оперируете
терминами проводка, сальдо, актив/пассив, квартальный/годовой баланс, а не
абстрактными операторами if, new и goto. Синтаксический разбор запросов на
естественном языке - вы работаете с предложениями, словами и лексемами, а
не организовываете циклы для посимвольного анализа строки.
Соответственно, для широкого круга задач значительно (до порядка)
возрастает скорость разработки, и дополнительно обеспечивается очень
высокая надежность программы. А современные профессиональные Прологсистемы
обеспечивают скорость работы, не уступающую скорости
выполнения аналогичных программ, написанных на Си. Конечно, если не
решать на Прологе задачи обращения степенного ряда.
Однако в России уже очень давно ведутся работы над языком РЕФАЛ,
имеющим сходную с Прологом декларативную идеологию. Но если раньше про
Посмотри в окно!
Чтобы сохранить великий дар природы — зрение,
врачи рекомендуют читать непрерывно не более 45–50 минут,
а потом делать перерыв для ослабления мышц глаза.
В перерывах между чтением полезны
гимнастические упражнения: переключение зрения с ближней точки на более дальнюю.
наоборот", то по крайней мере самым функциональным из декларативных
сегодня является именно РЕФАЛ-5.
2. Краткое описание синтаксиса.
Данную главу нельзя рассматривать как учебник по языку Пролог, а
только как краткий "ликбез", служащий для иллюстрации принципов
продукционного программирования, описанных выше.
Синтаксис
ТЕРМЫ
Объекты данных в Прологе называются термами. Терм может быть
константой, переменной или составным термом (структурой).
Константами являются целые и действительные числа, например:
0, -l, 123.4, 0.23E-5,
(некоторые реализации Пролога не поддерживают действительные
числа).
К константам относятся также атомы, такие, как:
голди, а, атом, +, :, 'Фред Блогс', [].
Атом есть любая последовательность символов, заключенная в
одинарные кавычки. Кавычки опускаются, если и без них атом можно
отличить от символов, используемых для обозначения переменных.
Приведем еще несколько примеров атомов:
abcd, фред, ':', Джо.
Полный синтаксис атомов описан ниже.
Как и в других языках программирования, константы обозначают
конкретные элементарные объекты, а все другие типы данных в
Имена переменных начинаются с заглавных букв или с символа
подчеркивания "_". Примеры переменных:
X, Переменная, _3, _переменная.
Если переменная используется только один раз, необязательно
называть ее. Она может быть записана как анонимная переменная,
состоящая из одного символа подчеркивания "_". Переменные, подобно
атомам, являются элементарными объектами языка Пролог.
Завершает список синтаксических единиц сложный терм, или
структура. Все, что не может быть отнесено к переменной или
константе, называется сложным термом. Следовательно, сложный терм
состоит из констант и переменных.
Теперь перейдем к более детальному описанию термов.
КОНСТАНТЫ
Константы известны всем программистам. В Прологе константа может
быть атомом или числом.
ATOM
Атом представляет собой произвольную последовательность символов,
заключенную в одинарные кавычки. Одинарный символ кавычки,
встречающийся внутри атома, записывается дважды. Когда атом
выводится на печать, внешние символы кавычек обычно не печатаются.
Существует несколько исключений, когда атомы необязательно
записывать в кавычках. Вот эти исключения:
1) атом, состоящий только из чисел, букв и символа подчеркивания и
начинающийся со строчной буквы;
2) атом, состоящий целиком из специальных символов. К специальным
символам относятся:
+ - * / ^ = : ; ? @ $ &
Заметим, что атом, начинающийся с /*, будет воспринят как начало
комментария, если он не заключен в одинарные кавычки.
Как правило, в программах на Прологе используются атомы без
кавычек.
Атом, который необязательно заключать в кавычки, может быть
записан и в кавычках. Запись с внешними кавычками и без них
определяет один и тот же атом.
Внимание: допустимы случаи, когда атом не содержит ни одного
символа (так называемый 'нулевой атом') или содержит непечатаемые
символы. (В Прологе имеются предикаты для построения атомов,
содержащих непечатаемые или управляющие символы.) При выводе
таких атомов на печать могут возникнуть ошибки.
ЧИСЛА
Большинство реализации Пролога поддерживают целые и
действительные числа. Для того чтобы выяснить, каковы диапазоны и
точность, чисел следует обратиться к руководству по конкретной
реализации.
ПЕРЕМЕННЫЕ
Понятие переменной в Прологе отличается от принятого во многих
языках программирования. Переменная не рассматривается как
выделенный участок памяти. Она служит для обозначения объекта, на
который нельзя сослаться по имени. Переменную можно считать
локальным именем для некоторого объекта.
Синтаксис переменной довольно прост. Она должна начинаться с
прописной буквы или символа подчеркивания и содержать только
символы букв, цифр и подчеркивания.
Переменная, состоящая только из символа подчеркивания, называется
анонимной и используется в том случае, если имя переменной
несущественно.
ОБЛАСТЬ ДЕЙСТВИЯ ПЕРЕМЕННЫХ
Областью действия переменной является утверждение. В пределах
утверждения одно и то же имя принадлежит одной и той же
переменной. Два утверждения могут использовать одно имя
переменной совершенно различным образом. Правило определения
области действия переменной справедливо также в случае рекурсии и в
том случае, когда несколько утверждений имеют одну и ту же головную
цель. Этот вопрос будет рассмотрен в далее.
Единственным исключением из правила определения области действия
переменных является анонимная переменная, например, "_" в цели
любит(Х,_). Каждая анонимная переменная есть отдельная сущность.
Она применяется тогда, когда конкретное значение переменной
несущественно для данного утверждения. Таким образом, каждая
анонимная переменная четко отличается от всех других анонимных
переменных в утверждении.
Переменные, отличные от анонимных, называются именованными, а
неконкретизированные (переменные, которым не было присвоено
значение) называются свободными.
СЛОЖНЫЕ ТЕРМЫ, ИЛИ СТРУКТУРЫ
Структура состоит из атома, называемого главным функтором, и
последовательности термов, называемых компонентами структуры.
Компоненты разделяются запятыми и заключаются в круглые скобки.
Приведем примеры структурированных термов:
собака(рекс), родитель(Х,У).
Число компонент в структуре называется арностью структуры. Так, в
данном примере структура собака имеет арность 1 (записывается как
собака/1), а структура родитель -арность 2 (
...Закладка в соц.сетях