Мне понадобилось написать несколько небольших программ на прологе. Я, как программист на других языках программирования, сначала долго не мог понять такие простые вещи, как например, сделать копирование одной переменной в другую. Но в конце разобрался с этим. Результат своих усилий изложу в этой статье.
В конце я понял, есть очень простое правило, которое позволяло передать одну переменную в другую. Надо написать это в параметрах.
Для этого надо понять, что "," — это ИЛИ. То есть, если она не выполняется, по поиск продолжается в другом правиле. То есть, для решения этой проблемы надо сделать два правила. Здесь же "!" означает, что дальнейший поиск по этому правилу не производится. Знак "_" означает, что значение переменной не важно и цель согласуется с любым значением…
Глобальных переменных как таковых на ПРОЛОГ-Д нету. Как переменные можно передавать данные в параметрах правил.Пример, это функция факториала.
Список пишется как
правило([заголовок|хвост])
Мы обрабатываем заголовок, а хвост передаем рекурсивному правилу. Чтобы цикл завершился, надо предусмотреть конец обработки списка. Пример: сумма элементов списка.
Как правило, данные передаются в виде связанных пар, имя — значение. Как по имени найти значение? Очень просто, через дополнительную переменную. Пример: нам даны правила с названием и ценой цветка. Надо найти сумму списка.
Теперь я понимаю, что могу заняться программированием задач на этом языке.
Как скопировать одну переменную в другую?
В конце я понял, есть очень простое правило, которое позволяло передать одну переменную в другую. Надо написать это в параметрах.
скопировать(а, а).
Как реализовать условие на прологе?
Для этого надо понять, что "," — это ИЛИ. То есть, если она не выполняется, по поиск продолжается в другом правиле. То есть, для решения этой проблемы надо сделать два правила. Здесь же "!" означает, что дальнейший поиск по этому правилу не производится. Знак "_" означает, что значение переменной не важно и цель согласуется с любым значением…
условие(а, б, с) :- БОЛЬШЕ(а,б) , !, скопировать( с, 1). условие(_ , _ ,0). ?условие(1,2,d). %d=0 ?условие(11,2,d). %d=1
Как передать параметры между правилами.
Глобальных переменных как таковых на ПРОЛОГ-Д нету. Как переменные можно передавать данные в параметрах правил.Пример, это функция факториала.
fac(1, 1). % Инициализация fac(a,b):- СЛОЖЕНИЕ(a,-1,t), fac(t,c) ,!, СЛОЖЕНИЕ(a,c,b). ?fac(3,r). %r=6 ?fac(4,r). %r=10
Обработка списков
Список пишется как
правило([заголовок|хвост])
Мы обрабатываем заголовок, а хвост передаем рекурсивному правилу. Чтобы цикл завершился, надо предусмотреть конец обработки списка. Пример: сумма элементов списка.
сумма([],0). % это есть конец обработки сумма( [h|t], b) :- сумма( t, c), СЛОЖЕНИЕ(h,c,b). ?сумма([13,7,9,11],f). %f=40 ?сумма([1,7,9,121],f). %f=138
Как разыменовывать значение
Как правило, данные передаются в виде связанных пар, имя — значение. Как по имени найти значение? Очень просто, через дополнительную переменную. Пример: нам даны правила с названием и ценой цветка. Надо найти сумму списка.
цветок(лимон,200). цветок(фиалка,120). цветок(лилия,150). цветок(ирис,70). цветок(роза,120). сумма2([],0). % Правило которое суммирует. [h|t] означает что мы разделяем список на первый элемент h и конец t сумма2([h|t],y):- сумма2(t,x),!, % Двигаемся к следующему элементу цветок(h,z), % Получаем цену СЛОЖЕНИЕ(z,x,y). % Складываем сумму с ценой ?сумма2([фиалка,лилия,ирис],d). %d=340 ?сумма2([лимон,фиалка,лилия,роза,ирис],d). %d=660
Теперь я понимаю, что могу заняться программированием задач на этом языке.