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

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

[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.

Site Footer

Sliding Sidebar

About Me

About Me

For whom this blog for?

For those who are interested in modern Internet technologies, IT business, startups, management, quality control, personal effectiveness, motivation. Here I write about what is interesting, about problems I faced and solutions I found. I hope it will be interesting to you either.

What motivates me to write?

The desire to improve, to study deeper topics that interest me. Find people with similar problems and tasks, together look for ways out and solutions.

Feel free to contact if you have anything to say to me

Old Flash site with my artistic works and misuc.