Краткий экскурс в Пролог. Списки.

Продолжу свой краткий экскурс в Пролог, надеюсь мой взгляд на него «из глубины» императивных языков поможет вам разобраться с декларативным подходом быстрее.
Списки. Чтобы не дублировать мануал и учебники сразу приведу несколько примеров списков:

[1,2,3,4] % список числ
[a,b,c] % список констант
["Aa", "Bb", "Cc"] % список строк
[1, a, "Aa", [22,33,44]] % смешанный список

Списки, для удобства обработки разбиваются на голову и хвост. В простейшем случае, голова это первый элемент списка, хвост — все остальные элементы. В синтаксисе языка это выглядит так:

?- a([1,2,3]). % определим список
?- a([X|_]). % X – голова, а пустая переменная «_» - хвост.
?- X = 1. % ответ системы
?- a([_|X]). % X – хвост, а пустая переменная «_» - голова.
?- X = [2, 3].
?- a([X|Y]). % «контрольный» пример, когда мы просим систему саму определить хвост и голову
X = 1,
Y = [2, 3].

А теперь более практичный пример использования. Напишем предикат has, определяющий наличие элемента в списке:

has(X,[X|_]). % если голова списка и искомое значение равны, то «истина», аналогичное утверждение можно было записать и так: has(X, [X,_]).
has(X,[_|Y]) :-
has(X,Y). % если элемент хвоста равен искомому элементу значение будет «истина»
?- has(2,[1,2,3]). % пример использования
true ;
false.
?- has(2,[1,2,3,2,3,2]). % пример, - тут система находит сразу несколько элементов в списке, реагируя на каждый из них «истиной»:
true ;
true ;
true ;
false.
% давайте изменим предикат, таким образом чтобы он возвращал только одно значение:
has(X,[X|_]). % тут оставляем без изменений
has(X,[_|Y]) :-
has(X,Y), !. % здесь добавим встроенный предикат отсечения «!», подробнее можно прочитать здесь

Еще один наглядный пример я позаимствовал из книги У.Клоксин и А.Меллиш, «Программирование на языке Пролог», которую я всем рекомендую как простое и доходчивое введение в этот язык программирования. Смысл программы в замене одних слов в списке слов, другими:

replace(you,i).
replace(are,[am,not]).
replace(english,russian).
replace(do,no).
replace(X,X).
process([],[]).
process([H|T],[X|Y]):-
replace(H,X),process(T,Y),!.
?- process([you,are,a,pc], X).
X = [i, [am, not], a, pc].

Полезные ссылки: учебный курс «Основы программирования на языке Пролог» на intuit.ru.

Comments

comments

Leave a reply:

Site Footer

Sliding Sidebar

About Me

About Me

Для кого этот блог?

Для тех кого интересуют современные интернет технологи, IT бизнес, стартапы, менеджмент, контроль качества, личная эффективность, мотивация. Здесь я буду писать о том, что в первую очередь будет интересно мне, о проблемах и решениях. О том что пригодилось мне, и возможно будет интересно Вам.

Что заставило меня создать его?

Желание совершенствоваться. Достигать успеха. Находить людей со схожими проблемами и задачами, вместе искать выходы и решения.

Немного о себе.

Мой первый серьезный опыт в IT это работа над desktop приложениями в компании «Эксперт-Софт». У истоков её стояли несколько амбициозных и талантливых молодых людей, с огнем в глазах и желанием работать «как майкрософт». То чем мы там занимались вполне могли бы сегодня назвать «стартапом». Рук было откровенно мало, поэтому приходилось заниматься всем: кодированием на Delphi, написанием скриптов на VBA, дизайном, вёрсткой и поддержкой вебсайта, работой над рекламной полиграфией, проектированием интерфейсов и БД. Работы было много, но запал был велик, команда очень разношерстная, гармонично дополняя друг-друга в решении нетривиальных задач. Благодаря тому что пришлось попробовать многое, постепенно вырисовалось понимание того чем хочется заниматься, и как. Софтверным программированием я был сыт по горло. Массы проблем десктопного софта в вебе просто не было, по определению. Зато был четкий фокус на дизайне, юзабилити, скорости. Поэтому когда пришла пора уходить из «Эксперт-Софт», я без всякого сожаления стал искать работу как разработчик для web. Поскольку городишко у нас не очень большой, выбор был практически предопределен. Так я стал работать в «Оникс-Системз», где и продолжаю работать поныне. За время работы в компании я как разработчик принимал участие в работе над несколькими десятками проектов. Несколько десятков проектов было сделано мною как фрилансером. Самым большим проектом в котором я сыграл роль менеджера, считаю свою семью. Также довольно большой проект мы сейчас поднимаем с командой разработчиков (на данный момент команда состоит из четырех php разработчиков, одного flex кодера и тестировщика). Отсюда, большой интерес к современным практикам и методологиям, разным подходам в управлении командой, повышению эффективности и качества работы. По мере сил, вдохновения и свободного времени, я буду писать об этом.

Если у Вас возникли какие-то вопросы ко мне лично, буду рад если Вы свяжетесь со мной:

e-mail:
skype: denis.sheremetov
Старый сайт, с музычкой и флешом

Прочая онлайновая деятельность: