Pull to refresh

Заметки по программированию на ПРОЛОГ-Д

Мне понадобилось написать несколько небольших программ на прологе. Я, как программист на других языках программирования, сначала долго не мог понять такие простые вещи, как например, сделать копирование одной переменной в другую. Но в конце разобрался с этим. Результат своих усилий изложу в этой статье.

Как скопировать одну переменную в другую?


В конце я понял, есть очень простое правило, которое позволяло передать одну переменную в другую. Надо написать это в параметрах.

скопировать(а, а).


Как реализовать условие на прологе?


Для этого надо понять, что "," — это ИЛИ. То есть, если она не выполняется, по поиск продолжается в другом правиле. То есть, для решения этой проблемы надо сделать два правила. Здесь же "!" означает, что дальнейший поиск по этому правилу не производится. Знак "_" означает, что значение переменной не важно и цель согласуется с любым значением…

условие(а, б, с) :-
БОЛЬШЕ(а,б) , !, скопировать( с, 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


Теперь я понимаю, что могу заняться программированием задач на этом языке.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.