40гг первые цифровые компьютеры программирование путем коммутации проводов

Вид материалаДокументы

Содержание


Составные термы
База данных
ПримерПравило, определяющее отношение ребенок/2 через отношение отец/2, запишется следующим образом: ребенок(X, Y) :- отец(Y, X)
Функциональное программирование использует математическое понятие функции для выражения концепции действия.
В отличие от процедур (функций) императивных языков, значения функций однозначно определяются их аргументами и не зависят от ист
Понятие функции используется в функциональных языках программирования и для выражения концепции данных.
Числовые константы
Последовательность букв, цифр и специальных знаков
Error: undefined variable
Строковые константы
Математическая запись
Error: attempt to apply a non-procedure
Логические функции
Для символов
Логические связки
Условные выражения
Подобный материал:
1   ...   4   5   6   7   8   9   10   11   12

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

    ?- 5+4<3.

    No

    Пролог анализирует запрос и выдает ответ Yes (Да) в случае истинности утверждения и No (Нет) в противном случае или когда ответ не может быть найден.

    Хранение программ
    • Хранят программы на языке Пролог в текстовых файлах, чаще всего имеющих расширение pl, например, example1.pl.
    • Для того чтобы Пролог мог оперировать информацией, содержащейся в файле, он должен ознакомится с его содержимым (проконсультироваться с ним).

    ?- [example1].

    или

    ?- consult(example1).

    Термы и объекты
    • Программа на языке Пролог обычно описывает некую действительность.
    • Объекты (элементы) описываемого мира представляются с помощью термов.
    • Терм интуитивно означает объект.
    • Существует 4 вида термов: атомы, числа, переменные и составные термы.
    • Атомы и числа иногда группируют вместе и называют простейшими термами.


    Атом
    • Атом -это отдельный объект, считающийся элементарным.
    • В Прологе атом представляется последовательностью букв нижнего и верхнего регистра, цифр и символа подчеркивания '_', начинающейся со строчной буквы.
    • Любой набор допустимых символов, заключенный в апострофы является атомом.
    • Комбинации специальных символов + - * = < > : & также являются атомами


    Числа
    • Целые (Integer)
    • Вещественные (Float)


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

    X, _4711, X_1_2, Результат, _x23, Объект2


    Анонимная переменная
    • Анонимная переменная (обозначается одним символом подчеркивания) применяется, когда ее значение не используется в программе.


    Составные термы (функции)
    • Составные термы (функции) состоят из имени функции (нечислового атома) и списка аргументов (термов Пролога, то есть атомов, чисел, переменных или других составных термов), заключенных в круглые скобки и разделенных запятыми.
    • Группы составных термов используют для составления фраз Пролога.

    итого(клиент(X,23,_), 71)

    'Что случилось?'(ничего)


    Факты
    • Программировать на Прологе - значит описывать некий мир.
    • Программа на этом языке состоит из множества фраз, задающих взаимосвязь между термами.
    • Каждый терм обозначает ту или иную сущность, принадлежащую миру. Один из способов описания - это задание фактов.


    Факт
    • Факт - это утверждение о том, что соблюдается некоторое конкретное отношение. Он является безусловно верным. В разговорной речи под фактом понимается нечто вроде "Сегодня солнечно" или “Коле 10 лет". На Прологе это запишется в виде

    'Сегодня солнечно'.

    'Коле 10 лет'.


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


    Аргументы предикатов
    • Аргументы перечисляются через запятую и представляют собой какие-то объекты или свойства объектов, а имя предиката обозначает связь или отношение между аргументами.
    • Предикат однозначно определяется парой: имя и количество аргументов.

    Пример
    Факт "Коля работает слесарем" на Прологе запишется следующим образом:

    профессия(коля, слесарь).


    База данных
    • База данных на Прологе - это совокупность фактов.
    • В процессе работы в базу данных можно добавлять новые факты, удалять или изменять старые.


    Пример
    Составим базу данных из следующих фактов: "слон больше, чем лошадь", "лошадь больше, чем осел", "осел больше, чем собака" и "осел больше, чем обезьяна":

    больше(слон, лошадь).

    больше(лошадь, осел).

    больше(осел, собака).

    больше(осел, обезьяна).

    Запросы к базе данных


    Запрос - это последовательность предикатов, разделенных запятыми и завершающаяся точкой.
    • На естественном языке запятая соответствует союзу "и", а на языке математической логики обозначает конъюнкцию.
    • С помощью запросов можно "спрашивать" базу данных о том, какие утверждения являются истинными.
    • Предикат запроса называется целью.

    Примеры запросов

    ?- 5+4<3.

    No

    ?- больше(слон, лошадь).

    Yes

    ?- больше(лошадь, слон).

    No

    ?- больше(лошадь, корова).

    No


    Правила
    • Правило задает новый предикат через определенные ранее.
    • Правило состоит из головы (предиката) и тела (последовательности предикатов, разделенных запятыми). Голова и тело разделены знаком :-
    • Правило должно заканчиваться точкой.
    • Запятая в теле правила означает конъюнкцию (&&, логическое и).


    Правила
    • Знак :- есть схематическая запись стрелки (<-) и показывает, что из правой части следует левая. Этот знак читается как "если".
    • Интуитивный смысл правила состоит в том, что цель, являющаяся головой, будет истинной, если Пролог сможет показать, что все выражения (подцели) в теле правила являются истинными.
      Пример
      Правило, определяющее отношение ребенок/2 через отношение отец/2, запишется следующим образом:

    ребенок(X, Y) :- отец(Y, X).

    Это означает, что если человек Y является для человека X отцом, то X является ребенком Y. Здесь X и Y - переменные.


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


    Пример рекурсии

    больше(слон, лошадь).

    больше(лошадь, осел).

    больше(осел, собака).

    больше(осел, обезьяна).


    больше_2(X, Y) :- больше(X, Y).

    больше_2(X, Y) :- больше(X, Z), больше_2(Z, Y).

    Результат использования рекурсивных правил

    ?- больше(слон, обезьяна).

    No

    ?- больше_2(слон, обезьяна).

    Yes


    Функциональное программирование
    (пример - Excel)
    • Функциональное программирование ставит своей целью придать каждой программе простую математическую интерпретацию.
    • Эта интерпретация должна быть независима от деталей исполнения.

    Семантика ЯП

    Семантика ЯП задается определением средств описания данных и действий.





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


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


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

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


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


    Функции в функциональных языках являются объектами «первого класса».


    Элементы первого класса - это элементы с наименьшим количеством ограничений. Важные свойства таких первоклассных элементов:
      • На них можно ссылаться посредством переменных.
      • Их можно включать в структуры данных.
      • Их можно передавать как параметры.
      • Они могут быть возвращены в качестве результата.



    Язык Лисп
    • Лисп – интерпретатор
    • Обычно работа с интерпретатором Лиспа происходит по следующему сценарию:
    • Пользователь вводит выражение.
    • Интерпретатор вычисляет значение этого выражения и печатает результат.


    Элементарные выражения


    Выражения и значения выражений.

    Числовые константы обозначают числа, которые и являются их значениями. Разнообразие доступных типов чисел зависит от реализации языка, но все реализации поддерживают целые и вещественные числа, а многие ещё и рациональные и комплексные.

    10

    10


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

    Hello
    Error: undefined variable


    С именем «+» связана встроенная функция, вычисляющая сумму чисел, которая и является значением.

    +
    #


    Значением выражения '<символ> является сам этот символ. Лисп нечувствителен к регистру букв и значение символа приведено к стандартному виду.

    'Hello
    hello


    Строковые константы записываются в двойных кавычках и представляют последовательности отображаемых знаков.

    "Hello"
    "Hello"


    Две логические константы #t и #f обозначают истину и ложь.

    #f
    #f


    Константы и символы носят общее имя атомы, поскольку представляют собой простейшие элементы языка, из которых строятся выражения.


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

    (+ 2 2)
    4
    (* 1.1 2)
    2.2
    (= 1 2)
    #f


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


    Значение комбинации - результат применения функции, указанной первым элементом списка (оператором) к параметрам, которые являются значениями остальных элементов (операндов).


    В данном случае, операторы - встроенные функции +,*,=.

    Пример более сложного выражения.

    (+ (* 3 5) (- 10 5))
    20


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


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


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




    Математическая запись

    Запись на Лиспе

    f(x)

    (f x)

    g(x, y)

    (g x y)

    h(x, g(y, z ))

    (h x (g y z))

    sin x

    (sin x)

    x + y

    (+ x z)

    x + y·z

    (+ x (* y z))

    xy

    (expt x y)

    |x|

    (abs x)

    x = y

    (= x y)

    x + y < z

    (< (+ x y) z)



    В сравнении с этим многообразием и даже с синтаксисом большинства языков программирования префиксная форма кажется несколько непривычной и громоздкой. Но она обладает, по крайней мере, одним неоспоримым достоинством - описание синтаксиса умещается на одной строчке:


    <выражение> ::= <атом> | ( <выражение>)


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


    (/ [+ (* 3 5) (- 10 5)] 2)
    10

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


    Поэтому Лисп называют динамически типизированным языком.


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


    (1 2 3)
    Error: attempt to apply a non-procedure

    1 не является функцией. Поэтому попытка применить её приводит к ошибке.


    (+ 1 (= 1 2))
    Error in +: #f is not a number.


    Базовые функции.

    В Лиспе определён большой набор базовых функций, рассмотрим некоторые из них. Это во-первых арифметические операции (+,-,*,/). Функции + и * имеют произвольное количество аргументов. В принципе, это не очень хорошая практика, но в данном случае она себя оправдывает.


    (+ 1 2 3 4 5)
    15


    (+ 1)
    1


    (* 1 2 3 4 5)
    120



    Поскольку операции вычитания и деления не ассоциативны, попытка расширить их определение на произвольное количество аргументов может привести к путанице. Однако, для одного аргумента определено, что (- a)выдаёт -a , а (/ a)- 1/a.


    (- 5)
    -5


    (/ 10 5)
    2


    (/ 2 3)
    2/3



    Неожиданность. Ожидалось скорее 0 или 0.666667 в зависимости от типа данных. Но для непредубежденного человека вполне естественно. Впрочем, если реализация не поддерживает рациональных чисел (что допускается для Scheme) получим 0.666667.

    Для  деления с остатком предназначены функции quotient и remainder, возвращающие целую часть и остаток от деления.


    Логические функции

    Функции, возвращающие логические значения, называются предикатами. В Lisp принято названия предикатов (кроме распространённых арифметических операций сравнения =,>,<,<=,>= ) завершать вопросительным знаком или - буквой "p"(от слова predicate).


    (= 1 2)
    #f

    (odd? 2)
    #f

    (< 1 2)
    #t

    even? 2)
    #t


    (Подобно + и *, операции сравнения допускают произвольное число аргументов (но, конечно же, не менее двух). Это сделано всё с той же целью - уменьшить сложность выражений. Например (< x1 x2 …xn)вернёт #t, только если аргументы упорядочены по возрастанию.


    Для символов единственная осмысленная операция - сравнение на идентичность.

    (eq? 'a 'a)
    #t

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


    (= 1 1.0)
    #t

    (eq? 1 1.0)
    #f

    (eq? 1 1)
    #t


    Типовые предикаты

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

    (boolean? 1)
    #f

    (integer? 1)
    #t

    (real? 1.1)
    #t

    (procedure? '+)
    #f

    (number? 1)
    #t

    (integer? 1.1)
    #f

    (procedure? +)
    #t

    (symbol? '+)
    #t


    Логические связки

    Для представления логических связок используются функции not, or и and.

    (not x)

    возвращает #t, если значение аргумента равно #f и #f в противном случае.

    (or x1 x2 … xn)

    возвращает значение первого аргумента, не равного #f. Если же все аргументы имеют значение #f, то оно и возвращается.

    (and x1 x2 … xn)

    возвращает значение #f, если оно встречается среди значений аргументов. В противном случае возвращается значение последнего аргумента.


    Любое значение, отличное от #f интерпретируется как истина.


    (not #f)
    #t

    (not 0)
    #f



    Условные выражения

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

    (if p et ef)

    возвращает значение ef, если значение p - #f , и et в противном случае.

    (cond (p1 e1) (p2 e2) … (pn en))

    возвращает значение ei , для первого i при котором значение pi отлично от #f.


    Средства объединения объектов

    Определения

    Для определения новых объектов, применяются определяющие формы.

    (define n e)

    связывает имя n со значением выражения e.

    (define (f a1…an) e)

    определяет новую функцию с именем f.

    a1…an - формальные параметры, т.е. имена, используемые внутри тела функции для ссылок на соответствующие параметры.

    e -тело функции, выражение, определяющее её значение

    (define x 1)

    x

    1

    (+ x x)

    2

    (define x 2)

    (+ x x)

    4