Объекты данных в Прологе:

В Прологе объекты данных называются термами. Различные типы терминов перечислены ниже.

1.Числа:

Все версии Пролога позволяют использовать целые числа. Они записываются в виде любой последовательности чисел от 0 до 9, необязательно с предшествующим знаком + или —, например, 262, -39, +80, 55.

Большинство версий Prolog также позволяют использовать числа с десятичной точкой. Они записываются одинаковокак целые числа, однако содержат одну десятичную точку в любом месте, за исключением необязательных знаков+ или -, например 3,46, -0,452, +637.

2. Атомы:

Атомы являются константами без числовых значений и могут быть записаны тремя способами.

а) Любая последовательность из одной или нескольких букв, цифр и знаков подчеркивания (в верхнем или нижнем регистре), начинающаяся со строчной буквы, например

рокки
сегодня_это_четверг
frek_joyana
a32_BCD

но нет

Сегодня
сегодня-вторник
32abc

б) Любая последовательность символов, включая пробелы и прописные буквы, заключенная в одинарные кавычки, например

«Сегодня пятница»
«сегодня-пятница»
«32bcd»

в) Любая последовательность из одного или нескольких специальных символов в списке, содержащем + — * / › ‹ = & # @:

Примеры
+++
›=

+ —

3. Переменные:

Переменная — это имя терма, которое должно быть определено в запросе. Любая последовательность из одной или нескольких букв (верхнего или нижнего регистра), цифр и знаков подчеркивания, начинающаяся с буквы верхнего регистра или знака подчеркивания, обозначает имя переменной.

Переменная _, состоящая только из одного символа подчеркивания, распознается как анонимная переменная и зарезервирована для определенной цели.

X
Автор
Person_A
_123A

но нет

45_ABC
Человек-А
автор

4. Составные термины:

При написании программ на Прологе составные термины имеют фундаментальное значение. Составной термин — это структурированный тип данных, который начинается с атома, известного как функтор. За функтором следует последовательность из одного или нескольких аргументов, заключенных в скобки и разделенных запятыми. Наиболее распространенной формой является функтор(t1,t2,...,tn) n≥1

Если вы знаете другие языки программирования, может оказаться полезным рассматривать составной термин как структуру записи. Функтор представляет имя записи, а поля записи представлены аргументами. Количество аргументов составного термина называется его арностью. Некоторые примеры составных терминов:

любит(jhon,prolog)
читать(X)
собака(питер)
кошка(X)
›(3,2)
человек('уильямс', 32, доктор, париж)

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

нравится(собака(питер),X)
пред3(альфа,бета,гамма,Q)
пред(A,B,нравится(X,Y),-4,пред2(3,пред3(альфа) ,бета,гамма,Q)))

5. Списки:

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

например:
[dog,cat,y,mypred(A,b,c),[p,q,R],z]
[[john,28],[mary,56,teacher] ,robert,parent(victoria,albert),[a,b,[c,d,e],f],29]
[[portsmouth,edinburgh,london,dover],[portsmouth,london,edinburgh] ,[Глазго]]

Список, не содержащий элементов, называется пустым списком. Пишется как [ ].

6. Другие типы

Некоторые диалекты Пролога допускают другие типы терминов, например. строки символов. В предложениях Пролога атомы и составные термины имеют особое значение и все вместе известны как термины вызовов.

Абстракция данных:

Самое большое преимущество Пролога состоит в том, что эти спецификации могут быть реализованы напрямую. Алгебраическая версия пролога:

stack(pop(newstack), newstack) 
stack(pop(push(Stk, Elm)), Stk) 
stack(top(newstack), undefined) 
stack(top(push(Stk, Elm)), Elm) 
stack(isnew, newstack)

Эти переменные в Прологе начинаются с заглавных букв.

Утверждения пролога можно сделать следующим образом:

stack(isnew, Stk0)
stack(pop(push(push(Stk0, boar), dog)), Stkl)
stack(top(Stkl), Elm), print(Elm).
Print out is boar. Values of the variables are
Stk0 = newstack
Stkl = push(newstack, boar).

Во второй строке должны быть расположены операции push и pop. Однако этого можно избежать, добавив следующее утверждение:

stack(push(Stk, Elm), push(Stk, Elm)) (6)
Then, the preceding program can be written as:
stack(isnew, Stk0)
stack(push(Stk0, boar), Stkl)
stack(push(Stkl, dog), Stk2)
stack(pop(Stk2), Stk3)
stack(top(Stk3), Elm), print(Elm).

Был разработан метод использования Пролога для выражения алгебраических спецификаций, чтобы спецификации могли выполняться напрямую, в отличие от многих других языков. Следовательно, абстрактные типы данных могут быть описаны с помощью предиката для представления типа операций и функторов.

Стек и очередь можно рассматривать как абстрактные типы данных. Вызывающим абонентам стека и очереди нужно знать только эффекты всплывающих и push-сообщений. Внутренние представления им неизвестны.

Механизм наследования:

Мы создали абстрактные типы данных в предыдущих разделах, связав имена типов данных для прогнозирования имен и имен сообщений с параметрами. Мы создадим другую ассоциацию для реализации наследования; типы данных — это мировые имена, а имена сообщений — предикатные имена.

Поскольку Пролог не поддерживает нелокальные переменные, в программе на Прологе имеется большое количество аргументов. Хотя это наиболее естественный способ передачи информации через аргументы, при большом количестве аргументов он имеет некоторые недостатки. Поскольку аргументы обозначаются только их позициями, очень сложно поддерживать согласованность между вызывающим и вызывающим. Что еще хуже, Пролог не делает никаких ошибок, если аргументы вызывающего и вызывающего объектов не совпадают или если их порядок неверен. Отладка программы с большим количеством аргументов также очень сложна.

Абстракция управления:

В большинстве обычных диалектов программирования есть средство, которое позволяет выполнять набор рекомендаций снова и снова либо фиксированное количество раз, либо до тех пор, пока не будет выполнено заданное условие. В Прологе нет средств для циклов, но его можно получить, упорядочив цели, которые нужно повторять снова и снова. Это должно быть возможно различными способами, используя поиск с возвратом, рекурсию, встроенные предикаты или их сочетание.
Большинство циклов, таких как цикл For, цикл while, цикл do -while и т. д., моделируются с использованием рекурсия и операторы.
Цикл for:
Большинство языков программирования имеют цикл for, но в прологе такой возможности нет, аналогичный эффект можно создать с помощью рекурсии.

loop(0).
loop(N):-N>0,write('The value is:'),write(N),nl,
M is N-1,loop(M).

Приведенный выше предикат цикла определяется в терминах самого себя. Второе предложение определяется как цикл из N, мы сначала записываем значение в N, а затем вычитаем единицу, чтобы получить M, затем снова цикл из M. Это может быть завершено с помощью первого предложение, когда аргумент равен нулю, поскольку мы ничего не делаем, и его можно рассматривать как
завершающий оператор.

?- loop(4).
The value is: 4
The value is: 3
The value is: 2
The value is: 1
Yes

Мы не можем написать что-то вроде

Loop(N-1)
В качестве второго предложения для нашего цикла for в качестве пролога оцениваются только выражения, такие как N -1, при оценке целей. Если в качестве параметра используется N-1, то он принимает терм с инфиксным оператором и аргументами N и 1, а это нам не нужно.

Пример печати кубов чисел:

writecubes(1):-write(1),nl.
writescubes(N):-N>1,N1 is N-1,writescubes(N1),
Ncu is N*N*N,write(Ncu),nl.

Рекурсия.
Цикл рекурсии также называется циклом «до тех пор». В следующей программе показан пример цикла until или
рекурсии в Прологе.

go:-loop(initiate).
/* initiate is a dummy value used to get the looping process  started.*/
loop(done).
loop(X):-X\=done,write(‘Type done to end:’),read(Word),
write(‘Input was’),write(Word),nl,loop(Word).

Вывод :

Type done to end: laptop
Input was laptop
Type done to end: of. Input was of
Type done to end: book
Input was book
Type done to end: end.
Input was done
Yes

Повторить цикл:

Повтор ничего не повторяет, так как это просто успех при вызове, главное преимущество заключается в том, что он также преуспевает при возврате.
Первые пять строк в теле go_answer всегда будут успешными при оценке пятой строки (цель ).read(Ans) предложит пользователю ввести .if он недействителен, тогда пятая строка завершится ошибкой и вернется к Read and write('yeah or nah ')
И он достигнет оператора повторения, и он преуспевает и снова продолжается вперед. И процесс повторяется до тех пор, пока пользователь не введет допустимый оператор.

go_answer(Ans):-
write('Enter answer for a question '),nl,
repeat,write('yeah or nah:'),read(Ans),
valid(Ans),write('Answer is '),write(Ans),nl.
valid(yeah). valid(nah).

Вывод:

?- get_answer(X).
Enter answer to question
answer yeah or nah: don’t know.
answer yeah or nah: might be.
answer yeah or nah: nah.
answer is nah
X = nah

Выражения:

Операторы:

Все определяемые пользователем предикаты могут быть преобразованы в префиксный оператор, который содержит только один аргумент (называемый унарным предикатом). Это позволяет записывать аргумент функции без круглых скобок перед аргументом.

например, isa_color red вместо isa_color(red)

Существует также возможность преобразования унарного предиката в постфиксный оператор. Это помогает написать функтор после аргумента.

например, розовый isa_color

Все пользовательские предикаты можно заменить на инфиксный оператор, который содержит два аргумента (называемый бинарным предикатом). Это позволяет записывать аргумент функции (имя предиката) без круглых скобок между двумя аргументами.

Например. likes (steve, madden) можно записать как Стив любит madden, что легко понять.

Все определяемые пользователем предикаты, которые содержат один или два аргумента, могут быть преобразованы в оператор путем ввода цели с помощью предиката системной команды op. Этот прогноз является результатом трех аргументов, например

?-op(150,abc,dislikes).
  • · 1-й аргумент — это «приоритет оператора», представляющий собой целое число в диапазоне от 0 и выше.
  • · Второй аргумент должен быть одним из трех определений ниже:

›abc означает, что предикат является бинарным, и его нужно заменить на инфиксный оператор.

›bc означает, что предикат унарный, который нужно заменить на префиксный оператор.

›ab означает, что предикат унарный, который нужно заменить постфиксным оператором.

  • · Третий аргумент определяет имя предиката, который должен быть преобразован в оператор.

Предикат также можно изменить на оператор, введя строку, в качестве примера рассмотрим

?-op(150,abc,dislikes).

Арифметика:

Любые переменные арифметического выражения уже должны быть связаны, а их значения должны быть числовыми. Цель всегда будет успешной, если они есть, и переменная, которая помогает в формировании первого аргумента, связывается со значением арифметического выражения. Будет сообщение об ошибке, если они не связаны.

?- X is 10.3+4.1*3.
X = 22.6
?- X is 11,Y is X+3.
X = 11 ,
Y = 14

Арифметические символы, такие как +-* /, представляют собой особый вид инфиксных операторов, известных как арифметические операторы. Это не предикатные значения, а функции, возвращающие числовое значение, в отличие от операторов, повсеместно используемых в Прологе.

В Прологе доступно множество арифметических операторов и арифметических функций. Некоторые из них,

X+Y → дополнение

X-Y → разница

X*Y → продукт

X/Y → частное

X//Y → выводит «целое частное» значения X и Y.

X^Y → значение X в степени Y

-X → отрицательный от X

abs(X) → абсолютное значение X(градусы)

sin (X) → синус X (градусы)

cos(X) → косинус X

max(X,Y) → большее из X и Y

sqrt(X) → квадратный корень из X

инфикс op → (=:= =\= › ›= ‹ =‹) известны как операторы отношения. Они сравнивают значения двух арифметических выражений.

E.g

?- 89+14–3=:=109–3*3.
yes
?- 101=\=98.
Yes

Операторы равенства:

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

а.) Равенство =:=

Q1=:=Q2 проверяется на истинность, если арифметические выражения Q1 и Q2 дают одно и то же значение.

?- 6+3=:=6*3–9.
Yes

б.) Неравенство =\=

Если выражения Q1 и Q2 не оценивают одно и то же значение, Q1=\=Q2 завершается успешно.

?- 12=\=6+8.
yes

c.) Условия идентичны ==

Обе стороны инфиксного оператора == должны быть выражениями. Цель Term1==Term2 успешна тогда и только тогда, когда Term1 совпадает с Term2. Любые переменные, используемые в терминах, могут быть связаны или не связаны, но в результате оценки цели никакие переменные не связаны.

?- likes(X,prolog)==likes(X,prolog).
X = _
?- likes(X,prolog)==likes(Y,prolog).
no

г.) ​​Термины не идентичны \==

Term1\==Term2 проверяет, не совпадает ли Term1 с Term2. Если Term1==Term2 терпит неудачу, цель будет успешной. В противном случае он потерпит неудачу.

?- predic(X)\==predic(Y).
X = _ ,
Y = _

e.) Условия, идентичные унификации =

Термин оператор равенства= похож на == с одним существенным отличием (и иногда очень полезным). Цель Term1=Term2 успешна, если термины Term1 и Term2 унифицируются, т. е. существует какой-то способ связать переменные со значениями, чтобы сделать термины одинаковыми. Если цель будет успешной, такая привязка действительно произойдет.

?- predic(X)=predic(10).
X = 10

(Переменная X привязана к 10, что делает два термина идентичными.)

f.) Необъединение двух терминов \=

Если Term1=Term2 терпит неудачу, то есть два термина не могут быть объединены, цель Term1\=Term2 достигает успеха. В противном случае он потерпит неудачу.

?- 5+5\=4+6.
yes

Логические операторы:

Не оператор

Префиксный оператор с именем not/1 может быть записан перед любым Result для вывода его отрицания. Отрицательный Результат терпит неудачу, если исходный Результат завершается успешно, и завершается успешно, если исходный Результат терпит неудачу.

E.g

животное (собака).

?- not animal(dog).
no
?- animal(lion).
no
?- not animal(dog).
yes

Оператор дизъюнкции:

Оператор дизъюнкции ; (может быть представлено как символ с запятой) может быть для операции «или». Это инфиксный оператор, который принимает на вход два аргумента, оба из которых являются результатами.

Результат1; Результат2 завершается успешно, если успешно выполняется либо Результат1, либо Результат2.

?- 7< 4;8 is 5+3.
yes

Ссылка:

Логическое программирование на прологе-https://www.springer.com/us/book/9781447154860

УЧАСТНИКИ ЭТОГО РУКОВОДСТВА:

Саи Киран Редди Сурабхи @ Kiran

Кальян Нагаварам @ Kalyan

Шри Каран Давулури @ Каран

Шри Харша Донепуди @ Harsha

Санкальп Могулоту @ sankalp