Теория:

Строя базу знаний «Семья», сами определяли все нужные для этой базы предикаты: часть из них определялась совокупностью фактов, другая часть — правилами вывода. Но представьте себе, как было бы неудобно, работая с процедурными языками программирования, каждый раз писать, например, алгоритм сложения двух чисел, или алгоритм вычисления значения функции x , или алгоритм конкатенации двух слов. От всей этой работы вы освобождены благодаря тому, что указанные операции и функции встроены в язык. Так же и в логических языках программирования: наиболее употребительные предикаты имеются в самом языке.
Например, для организации простейших арифметических операций имеется встроенный предикат, который мы назовем \(Linear(x, y, z, v)\); в реальных языках логического программирования он может называться по-другому. Этот предикат принимает значение Истина в том и только в том случае, когда его аргументы связаны соотношением \(v=xy+z\). На основе этого предиката легко определить предикаты, позволяющие подсчитывать сумму и произведение двух чисел:
 
Sum(x,y,z):=Linear(x,1,y,z),Mult(x,y,z):=Linear(x,y,0,z).
 
Обратите внимание, что переменные в описании предиката — это формальные параметры и вместо них, как обычно, могут быть записаны имена любых других переменных того же типа или соответствующие константы. В нашем случае мы воспользовались числовыми константами \(0\) и \(1\).
В каждом языке логического программирования есть предикат сравнения. Будем считать, что он записывается так: \(Comparison(x,y,z)\), где \(x\) и \(y\) — числовые или символьные переменные, а \(z\) — логическая переменная, принимающая два значения: Истина и Ложь. Этот предикат дает значение Истина в том и только в том случае, когда \(x<y\) и \(z\) имеет значение Истина (в случае символьных переменных это означает, что значение переменной \(x\) по алфавиту располагается раньше значения переменной \(y\)). На основе этого предиката легко определить предикаты, соответствующие отношению «меньше», «не меньше», «равно», «больше»:
 
Less(x,y):=Comparison(x,y, Истина);Notless(x,y):=Comparison(x,y, Ложь);Equal(x,y):=Comparison(x,y, Ложь),Comparison(y,x, Ложь);More(x,y):=Less(y,x).
 
Встроенные логические предикаты (в них все переменные логические) отрицания и конъюнкции мы запишем так: \(Not(x,y)\) истинен тогда и только тогда, когда \(x\) Истина, а \(y\) — Ложь или \(x\) — Ложь, а \(y\) — Истина;
\(And(x,y,z)\) истинен тогда и только тогда, когда \(x\) — Истина, \(y\) — Истина и \(z\) — Истина.
Благодаря законам де Моргана предикат дизъюнкции определяется так: Or(x,y,z):=Not(x,v),Not(y,w),And(v,w,s),Not(s,z).
А теперь попрограммируем. Тип переменных, входящих в предикаты (целый, вещественный, символьный и т. д.), объявляется, как и в процедурных языках, в начале программы. Однако мы не будем этого делать, поскольку все создаваемые нами программы носят иллюстративный характер и обычно понятно по умолчанию, переменные какого типа в них используются.
Пример:
Пусть требуется найти объем прямоугольного параллелепипеда с ребрами \(10, 20\) и \(30\).
Пишем предикат, определяющий объем: Vol(a,b,c,v):=Mult(a,b,z),Mult(z,c,v).
И делаем запрос: \(? Vol(10, 20, 30, v)\)
Легко предсказать, какой ответ даст Пролог на этот запрос. Но заметьте, что для решения другой задачи — найти высоту прямоугольного параллелепипеда длины \(10\), ширины \(20\) и объема \(600\) — мы обращаемся к тому же предикату, но с другим запросом: \(?Vol(10, 20, c, 600) \).
Это и понятно — база знаний о том, что такое объем прямоугольного параллелепипеда, не меняется. А какие задачи вы будете решать — дело ваше.
Можно сказать так, что база знаний — это модель объекта, процесса или явления, записанная на языке логического программирования, а запросы к ней — это использование данной модели для решения конкретных задач.
А теперь запрограммируем нахождение наибольшего общего делителя двух натуральных чисел \(a\) и \(b\).
О \(НОД(a, b)\)  мы знаем следующее:
  1. \(НОД(a, a) = a\)
  2. Если \(a<b\), то \(НОД(a, b) = НОД(a, b – a)\)
  3. Если \(a > b\), то \(НОД(a, b) = НОД(a– b, b)\)
Вот и запишем это с помощью уже известных нам предикатов:
 
LCD(a,a,a);LCD(a,b,c):=Less(a,b),Sum(a,y,b),LCD(a,y,c);LCD(a,b,c):=More(a,b),Sum(x,b,a),LCD(x,b,c).
 
В этой базе знаний один факт и два правила вывода. Сделаем к этой базе знаний запрос: \(?LCD(20,35,x)\)
Поскольку 2035, под факт наш запрос не попадает. Не попадает он и под второе правило, поскольку значение предиката \(More(20, 35)\) — Ложь. А в первом правиле предикат \(Less(a, b)\) истинен, поэтому разыскивается такой \(y\), чтобы был истинен предикат \(Sum(20, y, 35)\). Такое значение \(y\) только одно: \(15\). Поэтому надо разыскивать такое \(x\), чтобы был истинен предикат \(LCD(20, 15, x)\). Для поиска такого значения переменной \(x\) снова обращаемся к базе знаний. Теперь придется воспользоваться вторым правилом и разыскивать \(x\), для которого истинен предикат \(LCD(5, 15, x)\). Следующий шаг приведет к поиску \(x\), для которого истинен предикат \(LCD(5, 10, x)\). Еще один шаг приводит к предикату \(LCD(5, 5, x)\). И тут происходит обращение к факту, и получается ответ: \(x = 5\). Разобравшись в этом процессе, легко понять, что в базе знаний нами было записано рекурснвное правило, т. е. правило, в котором предикат, записанный в голове, фигурирует и в теле этого правила. Впрочем, как и для алгоритмов, рекурсия может создаваться не одним правилом, а некоторой их совокупностью. В реальном языке логического программирования есть много других встроенных предикатов, в том числе позволяющих строить графические изображения па экране компьютера. Мы, однако, не преследуем цель научить вас программированию на языке Пролог, но надеемся, что представление о таком программировании вы получили.
Источники:
Гейн А. Г., Ливчак А. Б., Сенокосов А. И. Информатика и ИКТ.  10 класс. М. : Просвещение, 189 с