Таблица Умножения Prolog

В первой части статьи о Prolog рассказывалось о структуре, синтаксисе и интерпретации языка. Конечно же научно-популярная . Victorius Aquitanus), хронист, учёный-пасхалист середины V в. Liber calculi) и составил серию таблиц умножения (лат. Викторию Аквитанскому также принадлежит сочинение «Пролог Пасхи» (лат. Это таблица умножения. Её нужно запомнить один раз — это сильно упростит жизнь, проблемы уйдут сами собой, а волосы станут мягкими и .
Prolog — примеры использования (Часть 2) / Хабрахабр. В первой части статьи о Prolog рассказывалось о структуре, синтаксисе и интерпретации языка. Конечно же научно- популярная литература интересна для программиста, но гораздо более интересно что- то интерактивное, живое, запускаемое. Поэтому в этой статье я предлагаю вооружиться SWI- Prolog и рассмотреть решения простейших задач на Прологе. Прежде, чем начинать, хотелось бы кратко ответить на злободневные вопросы от хабрачитателей: — Где реально используется Пролог?— Такие проекты существуют, некоторые приводились в комментариях к 1- й статье. Важно что, большинство программистов пишут на Прологе не от безвыходности, а от того, что им нравится Пролог.
В конце концов Пролог не может использоваться для любой задачи, такой создание UI или манипулирование с файлами.— Почему таких проектов мало?— Потому что программистов владеющих Пролог крайне мало, не только потому что люди не изучали его, а потому что недоизучали для написания полных программ. Главная же причина, что люди недостаточно четко понимают в каких ситуациях лучше всего его использовать. Часто можно видеть, что ярые сторонники Пролога, пишут на нем все, включая обработчиков клавиатуры и мыши, из- за чего код получается еще хуже, чем на С.— Почему нет сообщества Пролога?— Оно есть. Такова специфика языка, что он очень полюбился в академической среде (большинство Prolog систем пишутся в различных университетах и наоборот практически любой университет пишет свой Пролог), из- за этого можно сказать страдает и применимость языка. Стоит отметить, что сообщество небольшое, но очень лояльное: практически все известные языки нашли свое отражение в современных языках (Lisp, ML - > F#, Scala; Smalltalk - > Java, Scala (агенты), скриптовые - > Ruby), в отличие от Пролог. Думаю на этом хватит философских рассуждений и можно приступить к реальным примерам : )В конце как обычно ожидает задача на приз.


Пример . X is 3 + 1 * 2 — вычисляет выражение справа и заносит в переменную слева, это не присваивание (!), а утверждение что X = 7. Проще говоря фраза X = 7, X = 3 — не имеет решения потому как X не может быть одновременно 7 и 3. Задача была написать предикат, который бы генерировал все натуральные числа подряд, вот решение:ints(0).
Проблема стандартного предиката, что он работает правильно для запроса : - integer(1) и не работает для запроса integer(X). Задача: написать программу, которая бы находила все совершенные числа. Решение очевидно, пробегаем по всем целым числам и проверяем не являются ли они совершенными, эта стратегия очень хорошо применима к императивным языкам, мы и сами не замечаем, как сразу же ищем алгоритм поиска решения, а не анализируем задачу. В Прологе мы должны не пытаться описать поиск решения задачи, а пытаться описать постановку задачи, чтобы сделать это руководствуйтесь правилом: Не пытайтесь описать инструкции поиска решения, предположите, что вы уже нашли решение, а ваша задача только проверить, что решение найдено.
Как ни странно, но это стратегия прекрасно работает. Пишете запрос : - perfect. Обратите внимание запрос может быть : - perfect.
Тогда все ответы будут больше 6. Конечно программа работает не оптимально, сама проверка может быть упрощена с использованием простых делителей, попробуйте. Пример . Списки не являются базовым понятиям языка, между списками можно провести прямую аналогию со связными списками в C. Вернемся к определению терма как к рекурсивной структуре данных.
Рекомендуется пользоваться синтаксическим сахаром для списков, потому как внутреннее название термов может отличаться (чаще всего терм называется '.'). Все прекрасно помнят, что количество перестановок n!, но вот дай эту задачу большинству программистов и все начнут судорожно вспоминать и говорить, что писали это в школе и забыли как делается перебор.
В среднем алгоритм появляется после стараний и мучений через минут 2. При знании Пролога этот алгоритм пишется за 2 минуты или не пишется вообще : )Как же решить на Прологе? Воспользуемся правилом не поиска решения, а проверки, что решение найдено.
Предикат perm(Source, Permutation) — где Source исходный список, Permutation — перестановка. Интересно, что запросы симметричны : -perm(X, . Нам понадобится предикат member/2 — принадлежность элемента списку. Предположим у нас есть 2 списка: 1- й исходный список, 2- й — предполагаемое сочетание, необходимо проверить правильность сочетания.
Элементы сочетания располагаются в порядке исходного списка. Процесс написания на Прологе выглядит следующим образом: 1) первичное описание задачи и получение переборного решения 2) логическая оптимизация перестановкой предикатов справа 3) логическая оптимизация введения упрощенных проверок или удаление лишних условий 4) введение эвристик и оптимизация отдельних случаев путем отсечений. Вариант 1. Сортировка наивная : первый элемент отсортированного массива должен быть минимальным, остальные элементы должны быть отсортированы. Первый массив исходный, второй массив отсортированный исходный. Быстрая сортировка. Посмотрим на проблему со второй стороны и попытаемся определить место 1- го элемента списка в отсортированном массиве (применим рекурсию к исходному массиву).
Для того, чтобы еще улучшить результаты, мы можем вспомнить сортировку слияниями, которая в любом случае дает O(n lg n), но к сожалению данная сортировка применима только к массивам, а не к связным списка, с которыми мы работаем. Единственный вариант использовать дополнительную структуру данных для хранения — дерево. Вариант 3. Сортировка с использованием бинарного дерева. Для данного вида сортировки переведем исходный список в бинарное дерево, а затем, воспользовавшись обходом дерева слева, получим отсортированный массив. Дерево будем представлять рекурсивным термом tree(Object, Left.
Sub. Tree, Right. Sub. Tree). Сортировка с использованием сбалансированного бинарного дерева. Проблема использования бинарного дерева такая же как использования быстрой сортировки. Метод не гарантирует оптимальной работы. В случае бинарного дерева, дерево может быть разбалансировано и процедура добавления элемента в него может быть линейна, а не логарифмична.
Специально для этого выполняются процедуры балансировки дерева, ниже для ознакомления будет приведен алгоритм с использованием АВЛ- дерева. Для тренировки можно реализовать пузырьковую сортировку или сортировку вставками, оставим это на усмотрение читателя. Пример . Общая постановка задачи: даны некоторые емкости с водой, необходимо путем переливаний получить определенное количество воды в некоторой емкости. Для примера возьмем 3 кувшина емкостью 1. Для начала попытайтесь решить эту школьную задачу при помощи ручки и листка бумаги : )Прежде чем генерировать различные алгоритмы и пытаться их применить к задаче, давайте сначала перепишем условия в терминах Пролога.
Опишем емкость как терм sosud(Id, Maximum. Capacity, Current. Capacity), состояние системы опишем как список емкостей. Теперь опишем запрос: %% solve. Теперь когда нам все известно опишем способ проверки решения, считая что шаги заданы в переменной Steps. На самом деле полнота проверки серьезно улучшает шансы программы заработать правильно. Правильнее даже сказать так, с избыточной проверкой программа работать будет, иногда даже более оптимизировано, чем без, но с недостаточной проверкой программа при некоторых входных данных будет выдавать абсолютно неправильные результаты или зависать.
Что же, описание программы написано — можно запустить. Не стоит удивляться программа не заработает, оно попросту зависнет : ) Это не так плохо как может показаться, потому что если бы программа не зависла, то она выдала бы правильный ответ. Следует разобраться почему же она зависла и здесь нам на помощь придет понимание как же Пролог разворачивает правила, чтобы найти решение. На самом деле, не надо иметь голову способную запомнить до 1. То есть алгоритм постоянно переливает из 1- го во 2- й и обратно.
Для того, чтобы разрешить эту нелепость, на ум сразу приходит запретить делать одно и то же действие 2 раза, то есть иметь истории состояний и если состояние уже встречалось, то запретить его повторное попадание. Получается, что мы сужаем множество допустимых стратегий переливания, исключая повторения. На самом деле сужая множество стратегий, мы не сужаем множество допустимых состояний системы, то есть решений, что не трудно доказать.
Полная версия программа с распечаткой состояний и единственным предикатом для вызова solution:write. Договор На Сантехнические Работы. Как упражнение можно модифицировать программу, чтобы она находила переливания за оптимальное число шагов. Можете поэкспериментировать вот на этих задачках .
Замечание: ярые сторонники императивного программирования заметят, что все, что мы сделали это перебор всех состояний с возвратами (проход в глубину), причем без использования эвристик, и будут абсолютно правы. Дело в том, что мыслить в Прологе нужно как раз не перебором, а описанием задачи и описанием проверки решения, а к императивности вычислений всегда нужно возвращаться для оптимизации, если она нужна! Двойственность природы — не минус, а плюс. Стоит также отметить, что крупные Пролог системы, очень хорошо адаптированы для поиска состояний с возвратами. Заключение. Хотелось бы отметить, что задачи рассмотренные в данной статье являются этюдами для программирования на Прологе.
Так как большинство из них занимает около 1. Прологе в состоянии воспроизвести их по памяти при достаточном частом порешевании их. А возвращаться к ним обязательно стоит, так как это напоминает об искусстве программирования (точно так же как быстрая сортировка на C). Более сложные и более прикладные задачи для повседневного использования будут рассмотрены позже. В конце аж 2 задачки на приз : Как известно в функциональном и логическом всячески пытаются избежать программ с side эффектами, оборачивают их в монады, придумывают специальные концепции.
Магия чисел. Ментальные вычисления в уме и другие математические фокусы (fb. Ментальные вычисления в уме и другие математические фокусы (пер.
Владислав Ласкавый) 4. K, 1. 49с.(скачать fb. Майкл Шермер - Артур Бенджамин. Использовать online- читалку . Наверное, они сразу заметили, что счет на пальцах отлично работает.
Может быть, какой- нибудь древний человек по имени Ог (родившийся еще до потопа) или один из его приятелей сказал: «Нас тут один, два, три, четыре, пять. Значит, нам нужно пять кусочков фрукта. Так было положено отличное начало для развития математики.
Вы, вероятно, тоже впервые встретились с числами подобным образом. Должно быть, вы слышали, что математика — это язык науки, а природа говорит на языке математики.
Что ж, это правда. Чем больше мы понимаем Вселенную, тем больше математических связей в ее устройстве обнаруживаем. Цветы располагаются на стебле по винтовой линии, причем их количество на разной высоте совпадает с определенной последовательностью чисел (чисел Фибоначчи), которую несложно понять; к тому же любой самостоятельно ее высчитает. Узоры на раковине образуют совершенные математические кривые (логарифмические спирали), появившиеся вследствие определенных химических процессов. Скопления звезд тянутся друг за другом в математическом танце, и его можно наблюдать на расстоянии миллионов и даже миллиардов километров. В течение многих столетий подтверждается и открывается математическая сущность Природы. Однако с каждым новым открытием кто- то должен взять на себя труд удостовериться, что числа не лгут.
Эта книга поможет вам разобраться в этом. Освоив вычисления, вы узнаете ряд математических секретов природы, и трудно представить, куда это может вас привести! При знакомстве с числами вы поймете: ответ на самом деле лежит на кончиках ваших пальцев. Это не шутка: именно с этого все и начинается.
Поскольку у человека десять пальцев, математическая наука взяла за основу цифры от 1 до 1. По сути, мы называем и числа, и пальцы словом «цифры». Совпадение? Нашим далеким предкам очень скоро стало недоставать пальцев для счета. То же самое, вероятно, произошло и с вами. Мы не можем просто игнорировать большие числа и пенять при этом на свои руки (шутка!). Мы нуждаемся в числах, так как они часть повседневной жизни, хотя порой мы этого даже не замечаем. Подумайте о телефонной беседе с другом: чтобы позвонить, нужен номер телефона; время, потраченное на разговор, тоже измеряется в числах (в часах и минутах).
Каждая историческая дата, включая такую важную, как ваш день рождения, обозначается цифрами. Числа мы используем и для презентации идей, которые на первый взгляд не имеют ничего общего с расчетами. Например, выражение «Как молодо вы выглядите!» неявно подразумевает информированность о вашем возрасте, выраженном в числовом эквиваленте, а также оценку вашего внешнего вида тоже в виде числа. Люди часто описывают друг друга с помощью чисел, отображающих рост и вес человека. И конечно, мы все хотим знать, сколько денег у нас есть или сколько стоит та или иная вещь в числовом выражении: в долларах, песо, юанях, рупиях, рублях, евро или иенах.
Если по какой- то причине вы пока еще не влюблены в математику, читайте эту книгу. Конечно, как человек науки я надеюсь, что вам понравится эта дисциплина.
Хотя больше всего мне хотелось бы, чтобы вы ее полюбили. Что бы вы ни чувствовали по отношению к ней (ненависть или любовь), я все равно готов поспорить: вы часто будете ловить себя на мысли, что хотите узнать ответ сразу, без того чтобы сначала старательно все записать и усердно работать (или даже не тратя время на то, чтобы взять калькулятор). Вы мечтаете, чтобы ответ появился «по мановению волшебной палочки». Оказывается, множество математических задач решаются именно таким магическим образом. И книга продемонстрирует вам, как это делается. Что делает любую магию столь интригующей и увлекательной? Зрители не часто могут похвастаться тем, что понимают, как выполняется трюк.
Не знаю, но это круто!» Так вот, приемы и методы из этой книги сродни волшебству. Публика редко бывает осведомлена о секретах трюков — она просто ценит их.
Заметьте, что магия вряд ли чего- то стоит, если никто не смотрит представление. Но знание того, как работает магия чисел, не лишает вас увлекательной интриги. Простая арифметика не позволит вам увязнуть в вычислениях, и вы сможете сосредоточиться на прекрасной природе чисел. В конце концов, математика — двигатель Вселенной. Доктор Бенджамин занялся быстрыми вычислениями ради забавы.
Полагаю, этим он поразил своих учителей и одноклассников. Иллюзионисты могут заставить публику думать, что они обладают сверхъестественными способностями. Волшебники от математики создают иллюзию своей гениальности. Способность обратить внимание окружающих на то, что вы делаете, представляет собой часть обмена идеями. Если вы произвели на людей впечатление, они будут слушать то, что вы говорите.
Так что попробуйте немного поупражняться в магии чисел. Вы можете произвести впечатление на друзей? Отлично! Но вы также будете «выступать для себя» и поймете, что в состоянии решать задачки, которые, как вы полагали раньше, вам не по зубам. Вы придете в восторг от самого себя. Но счет на пальцах — совсем другое дело. Вы когда- нибудь замечали, что считаете вслух, или что- то шепчете, или издаете еще какие- то звуки во время вычислений? Это почти всегда упрощает расчеты.
Проблема, однако, в том, что окружающие думают, будто вы ведете себя немножко странно. Так вот, в «Магии чисел» доктор Бенджамин научит вас использовать функцию «говорю вслух» так, чтобы сделать решение задач более простым и быстрым, а ответы — точными (что удивительно).
И все это будет «выдаваться» вашим мозгом в процессе обдумывания задачи (как будто вы думаете вслух). Вы станете перемещаться по математическим задачкам так же, как мы читаем: слева направо. Вы будете щелкать сложные задания как орешки, выдавая результат с погрешностью в пределах процента или около того. Вы научитесь быстро выполнять арифметические действия.
Таким образом, вы сможете приятно провести время, размышляя о том, что означают цифры. Он задумался над вопросом: «Достаточно ли у нас фруктов для каждого человека, сидящего у костра? Если нет, то могут возникнуть проблемы». Теперь вы можете спросить: «Достаточно ли места на этом компьютере, чтобы отслеживать мои музыкальные файлы или банковский счет?
Если нет, то могут возникнуть проблемы». Это книга больше о секретах математики, чем просто о подсчетах. Например, вы научитесь определять, на какой день недели придется или приходилась та или иная дата.
Это просто фантастика, почти волшебство, когда вы в состоянии сказать кому- либо, в какой день недели он родился. Это действительно невероятно, если вы способны вычислить, что Соединенные Штаты Америки отмечали свой первый День независимости в четверг 4 июля 1.
Титаника» — был понедельник; что первый человек ступил на Луну 2. Вы никогда не забудете, что террористическая атака на США произошла 1.
С помощью магии чисел вы всегда сумеете доказать, что это случилось во вторник. Существующие в природе взаимосвязи лучше всего описывают именно числа. Один, два, три и далее до десяти — эти числа вы можете посчитать на пальцах. Но между ними есть еще бесконечное количество чисел. Некоторые числа никогда не заканчиваются. Они становятся настолько большими, насколько вы пожелаете, и настолько маленькими, что их трудно себе представить.
Вы, должно быть, знакомы с ними. В общем эта книга покажет вам, что все в природе имеет смысл.
Билл Найя,Science Guy. Он с блеском используется одними людьми и с трудом — другими.
Многие из нас боятся исследовать скрытые возможности его применения, тогда как некоторые пускают его в ход, словно меч, чтобы атаковать и покорять налоговые декларации или массивы данных, сопротивляющиеся менее храбрым людям. Возможно, эта книга не превратит вас в Лейбница, не возведет в ранг профессора алгебры, но, надеюсь, поспособствует появлению у вас нового, волнующего и даже занимательного взгляда на то, что можно делать с числами. Мы все думаем, что знаем достаточно об арифметике, чтобы сводить концы с концами, и, конечно, не чувствуем вины за то, что при каждом удобном случае обращаемся к карманному калькулятору, который стал неотъемлемой частью нашей жизни. Но так же, как фотография может скрыть истинную красоту картины Вермеера, а электронная клавиатура — стать причиной того, что мы забудем великолепное исполнение Горовица, чрезмерное доверие к технологиям способно лишить удовольствия, которое вы получите при изучении математики на этих страницах.
Я помню, какое наслаждение испытал в детстве, когда мне открылось, что можно умножать на 2. Метод сравнений по модулю 9 для проверки результатов умножения был следующим захватывающим этапом.
А когда я узнал о перекрестном умножении, то уже был на крючке и ненадолго превратился в невыносимого одержимого математикой. Прививки против такого недуга не существовало.
Приходилось лечить себя самому. Так что будьте осторожны! Вы не держали бы сейчас в руках эту книгу, если бы у вас не было желания улучшить свои математические навыки либо удовлетворить любопытство по отношению к этому увлекательному предмету. Так же как и при использовании любой инструкции, вы сможете удерживать в памяти и применять только определенный процент разнообразных трюков и методов, описанных здесь. Но даже это оправдает время, потраченное на чтение этой забавной книги. Я знаю обоих авторов довольно хорошо. Арт Бенджамин не только один из числа тех одаренных детей, на которых учителя постоянно ворчали в школе, но, как известно, и актер «Волшебного замка» в Голливуде, где он демонстрирует свои навыки (однажды Арт отправился в Токио, чтобы там в прямом эфире помериться математическими способностями с женщиной- ученым).
Майкл Шермер, с его специальными научными познаниями, имеет отличное представление о практическом применении математики (о том, как она используется в реальном мире). Если это ваше первое знакомство с такого рода полезным математическим материалом, то я вам завидую.
Prolog — удивительный язык программирования / Хабрахабр — Чем же он удивительный? Я знаю пару десятков языков и для меня не проблема изучить еще один новый, я просто уже не вижу необходимости. Пролог — уникален. Это единственный язык представляющий парадигму декларативного программирования; это язык, который имеет сотни различных имплементаций, но они все равно называются Prolog, добавляя лишь префиксы и суффиксы к названию; это живой язык в котором не происходит никаких существенных изменений более 2. Почему же Prolog?
Пролог — уникален по своей природе, он появился благодаря счастливому совпадению (таинственному устройству мира). Когда- то в 6. 0- х годах очень бурно развивалась теория автоматического доказательства теорем и Робинсоном был предложен алгоритм резолюций, который позволял доказать любую верную теорему (вывести из аксиом) за конечное время (за какое не известно). Как оказалось позже, это наилучшее решение общей задачи, невозможно доказать теорему за ограниченное число операций. Простыми словами, алгоритм представляет собой обход (в общем случае бесконечного) графа в ширину, естественно, что предсказуемость работы алгоритма практически равно 0, соответственно для Языка Программирования — это абсолютно не подходит.
И в этот момент Кальмэроу нашел блестящее сужение задачи, благодаря которому доказательство некоторых теорем выглядело как процедурное исполнение программы. Стоит отметить, что класс доказуемых теорем достаточно широк и очень хорошо применим для класса программируемых задач. Вот так в 1. 97. 2 появился Prolog. В этой статье я попытаюсь рассказать о Prolog как инструменте решения общих логических задач.
Этот топик будет интересен тем, кто уже владеет синтаксисом Prolog и хочет понять его изнутри, а также тем, кто абсолютно не владеет синтаксисом языка, но хочет понять его «изюминку» не тратя лишнее время на изучение синтаксических конструкций. Главной чертой Prolog является то, что его можно легко читать, но очень тяжело писать, что принципиально отличается от всех mainstream языков, которые так и говорят писать стало еще легче еще один шаг и можно будет писать на планшете, перетягивая рабочие модули как друзей в Google+, от этого все мы знаем очень сильно страдает само качество кода. Вроде бы каждая строчка понятна, но как система работает за гранью понимания даже для разработчиков, как говорится наиндусили. Мне кажется во всех книгах по обучению Prolog, делают одну и ту же ошибку, начиная рассказ о фактах, отношениях, запросах и у человека складывается отношение к языку как к Экспертной Системе или Базе Данных.
Гораздо важнее научится правильно читать программы и почитать так с десяток : )Как правильно читать программы на прологе. Читать программы очень просто, так как в языке очень мало специальных символов и ключевых слов и они легко переводятся на естественный язык.
Главная ошибка программиста, что он хочет сразу представить как программа работает, а не прочитать, что программа описывает, поэтому мне кажется обучить незатуманенный мозг обычного человека, гораздо проще чем програмиста. Понятия. В языке существует 2 понятия предикаты (условия) и объекты (они же переменные и термы).
Например green. Сколько в предикате параметров, такова и арность предиката. Константы — это числа и строки, переменные — выражают неизвестный объект, возможно искомый, и обозначаются как строчки с большой буквы.
Оставим пока термы и рассмотрим простейшую программу. Программа. Программа — это набор правил, вида Если условие. Математически верно, правило звучит: для любой переменной — «Число», если оно простое и нечетное, то оно простое.
Аналогично, можно перефразировать так: Если существует «Число», что оно нечетное и простое, то оно нечетно. Поэтому имя переменной очень важно! Если в левой части (до : - ) заменить Число на Число. Для любого Число. Число, если Число — простое и нечетное, то Число.
Получается все числа простые! Это самая распространенная ошибка в Прологе.
A : - B. Правила могут не иметь условий, в этом случае они называются фактами. В принципе существует, стандартный предикат . Таким образом выражается, сумма делителей X меньше либо равных Y, так как X делится на X, поэтому берем Y = X — 1. Далее 3 предиката определяют сумму делителей число меньше либо равных Y (Делитель), 1- й случай Y равное 1, 2- й случай Число делится на Y, тогда сумма. Программа — как набор определений.
Существует второй способ прочтения данных правил, менее математический и более естественный, основанный на «определениях». Можно заметить, что в Прологе все правила слева (в части то) содержат только одно условие, что по сути является «определением» это условия. Одинаковые предикаты группируются по имени объединяясь условием «или». То есть к определению можно добавить: «Ч» совершенное число, когда ., или когда «Ч» — это 1. Данный способ чтения широко применяется, так как позволяет объединять предикаты в однородные группы и помогает понять, в каком же порядке интерпретатор раскручивает предикаты, для того, чтобы проверить истинность некоторого утверждения. Например, очевидно, что если предикат не имеет ни одного определения, то доказать истинность утверждения с ним невозможно. Терм = 'имя'(объект, объект, ..), пример person('Name', 'Surname'), '+'(1, 2), person(address('Некоторый адрес'), surname('Фамилия'), phone('Телефон')) .
Если рассматривать терм, как математическое понятие, то терм является функцией, а точнее функтором, то есть '+'(1, 2) — означает, что существует такой объект, который равен 1+2. Это абсолютно не означает, что 1+2 = 3, в Прологе — это выражение неистинно, точно так же как и в группе остатков по модулю 2, там 3 вообще не существует. Опять же с математической точки зрения Переменные связываются словом Для Всех, а если в утверждении необходимо слово существует то, для этой цели применяется терм (функтор). Для любого числа существует число- факториал : - factorial(X, fact(X)).
С точки зрения программирования терм можно объяснить гораздо проще: терм — это объект с набором атрибутов, атрибуты могут быть другими термами или константами или переменными (то есть не определены). Главное отличие, все объекты в Prolog immutable, то есть менять атрибуты в них нельзя, зато есть специальное состояние — переменная. Пример — целочисленная арифметика нат(0). Число натуральное, то существует объект число(Число), которое тоже является натуральным. Математически терм «число» выражает функцию +1, с точки зрения программирования «число» рекурсивная структура данных, вот ее элементы: число(0), число(число(0)), число(число(число(0))).
Отношение плюс — 0 + Число = Число. Если Ч1 + Ч2 = Рез, то (Ч1+1) + Ч2 = (Рез+1). Если Ч1 * Ч2 = Рез и Рез + Ч2 = Рез.
Ч1+1) * Ч2 = Рез. Ответ простой: избыточность очень плохо для любого определения. Да, это может помогать вычислениям, своеобразная преждевременная оптимизация, но побочными эффектами могут быть противоречия в определениях, неоднозначный вывод утверждения, зацикливание интерпретатора. Как Prolog понимает предикаты и как доказывает утверждения. Конечно чтение программ, помогает ощутить стиль Пролог, но не делает понятным для чего и как данные определения могут использоваться.
Полноценной программой, примеры приведенные выше, назвать нельзя так как не хватает входной точки. Входной точкой в Пролог является запрос, аналог запроса к базе данных SQL или аналог вызова главной функции в функциональном программировании. Примеры запросов: нат(Число) — найти натуральное число, плюс(0, 0, Результат) — найти результат сложения 0 и 0 в переменной Результат, нат(0) — проверить является ли 0 натуральным числом и др. Конечно, результаты запросов не трудно предсказать из логических соображений, но крайне важно понять, как программа их получила. Все- таки Пролог не черный ящик, а язык программирования, и в отличие от базы данных, где строится SQL- план и запрос может выполняться по- разному на разных Базах данных, Пролог имеет вполне определенный порядок выполнения. Дело в том, что в Базе данных мы вполне знаем какой ответ мы хотим получить исходя из данных в таблице, к сожалению глядя на Пролог программы достаточно сложно сказать, какие утверждения логически выводимы, поэтому понять как работает Пролог интерпретатор гораздо проще.
Рассмотрим на примере запроса плюс(0, 0, Результат) : 1. Находим совпадение (своеобразный pattern- matching, резолюция) данного запроса с левой частью одно из правил.
Для данного запроса плюс(0, Число, Число). Соотнесем поочередно все аргументы запроса с правилом и получим: 0 = 0, 0 = Число, Результат = Число.
В этих уравнениях участвуют 2 переменные (Число и Результат), решив их мы получаем, что Число = Результат = 0. Так как у данного правила нет условий, мы получили ответ на заданный вопрос. Ответ: да и Результат = 0. Запрос нат(Число) : 1. Находим 1- е совпадение с правилом, правило нат(0), решая уравнения по соответствию, проще говоря находя резолюцию, мы получаем Число = 0. Ответ: да и Число = 0.
Запрос плюс(Результат, 0, число(0)): 1. Находим резолюцию с правилом плюс(0, Число, Число): Результат = 0, 0 = Число, число(0) = Число, но (!) Число = 0 = число(0) — не возможно так как 0 совпадает число(0). Следовательно ищем резолюцию со следующим правилом. Находим резолюцию с правилом плюс(число(Ч1), Ч2, число(Рез)), получаем число(Ч1) = Результат, Ч2 = 0, число(Рез) = число(0), отсюда Рез = 0. У этого правила, есть условия которые мы должны проверить, учитывая результаты резолюции (значения переменных), плюс(Ч1, Ч2, Рез) - > плюс(Ч1, 0, 0). Запоминаем значение переменных в стеке и формируем новый запрос плюс(Ч1, 0, 0)3*.
Решая запрос плюс(Ч1, 0, 0) находим резолюцию с плюс(0, Число, Число) и получаем Ч1 = 0 и Число = 0. Возвращаемся по стеку к предыдущим переменным Результат = число(Ч1) = число(0). Ответ найден число(0).
Соответственно сейчас пролог машина решила уравнение X + 0 = 1. Грамотное составление правил на языке Пролог, очень сложная штука, но если их составить компактно, то можно получать не только прямые ответы и решения, но и обратные. Пример запроса плюс(Число, Число, Число): ответ да, Число = 0.