Skip to content

Instantly share code, notes, and snippets.

@lisp3r
Last active January 14, 2020 21:29
Show Gist options
  • Save lisp3r/21f88403c79578d03c91363e8d1c0220 to your computer and use it in GitHub Desktop.
Save lisp3r/21f88403c79578d03c91363e8d1c0220 to your computer and use it in GitHub Desktop.

Термы

Термы - все объекты Пролога (5 видов).

  • Простые термы: переменные, константы (атомы, числа)

  • Составные термы: списки, структуры

  1. Атом - текстовая константа. Имя начинается с маленькой буквы и может содержать буквы, цифры, подчеркивание. Тип данных - символьный.

  2. Число - целочисленная (Int) или действительная (real) константа.

  3. Переменная - переменная. Имя начинается с большой буквы. Может быть именованной и анонимной. Находится в одном из двух состояний: конкретизированная (содержит в себе один из пяти термов - число, атом, другую переменную, список или структуру) и не конкретизированная (содержит все, что угодно).

Конкретизированная:

    A = 1

Не конкретизированная:

    B(=_)

Анонимная:

    _ = 1
    _ = a

Лексическое пространство - область видимости переменной. Для именованной переменной лексическое пространство - одно предложение. Для не именованной - момент работы с ней.

  1. Список - набор однотипных переменных.

      [] - пустой список
      [1, 2, 3]
      [один, Два, три],  Два = _

    Списки делятся на голову и хвост:

      [Голова | [Хвост]]

    Голова и хвост могут содержать один и более элементов. Хвост должен быть списком.

      [1 | 2, 3]
      [1, 2 | [3]]
      [1, 2, 3 | []]
  2. Структура - структура. Состоит из функтора (имени) и аргументов, расположенных в (). При объявлении новой структуры ее арность (количество аргументов) фиксируется.

      структура_1(лекция_1, Тема, часа_2)

    Арность равно 3.

Процедуры

Процедуры Пролога являются встроенными и в явном виде отсутствуют.

  1. Процедура Проверки запроса на истинность.

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

Правила сопоставления термов:

  • Сопоставление констант дает истину, когда константы тождественны.

      1 v 1.                false
      один v один           true
      лекция_1 v лекция1    false
  • Сопоставление неконкретизированной переменной с любым термом всегда дает истину. При этом переменная конкретизируется. Сопоставление двух неконкретизированных переменных связывает их.

       A(=_) v [1, 2 | Хвост(=_)]       true
            <= (конкретизация)
       B(=_) v C(=_)                    true
            <=> (связанные переменные)

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

  • Сопоставление конкретизированной переменной с термом определяется правилами сопоставления термов.

       Д(=_) = 2
  • Сопоставление списков:

    1. Сопоставление арностей списков
    2. Сопоставление элементов списков по очереди

    Пример:

        [1, 2, 3] v [Один, 2, Три]        TRUE
             1) 3 v 3                     true
             2) 1 v Один(=_)              true
                  => (конкретизация)      
                2 v 2                     true
                3 v Три(=_)               true
                  => (конкретизация)     

    Пример:

        [1, 2, 3]  v  [Один, 2 | Три1]       TRUE
              1) 3 v ≥2                      true
                     Три1(= [_])
              2) 1 v Один(=_)                true
                   => (конкретизация)       
                 2 v 2                       true
                 [3] v Три1(= [_])           TRUE
                    1) 1 v 1        true
                    2) 3 v _        true
                         => (конкретизация)
  • Сопоставление структур

    1. Сопоставление функторов

    2. Сопоставление арностей

    3. Сопоставление элементов списков по очереди

    Пример:

        лекция(1, Тема, часа_2) v лекция(N, сопоставления, Время)     TRUE
             1) лекция v лекция                                       true
             2) 3 v 3                                                 true
             3) 1 v N(=_)                                             true
                  => (конкретизация)
                Тема(=_) v сопоставления
                        <= (конкретизация)                            true
                часа_2 v Время(=_)                                    true
                       => (конкретизация)

Структура программы на Visual Prolog

Синтаксис предложений

Предложение заканчивается точкой (.).

,   И
;   ИЛИ
< > не равно

Основные области

DOMAINS

Используется для описания аргументов пользовательских структур.

PREDICATES

Используется для описания пользовательских структур.

При описании пользовательских структур указывают:

  • имя
  • арность (неявно)
  • типы аргументов, если не описаны в DOMAINS

CLAUSES (база фактов и правил)

Область программного кода.

Содержит предложения двух видов:

  • Факт Всегда истина. Состоит из утверждений и заканчивается точкой. Утверждение - структура.

    <утверждение>. % факт

  • Правило

    В правой части стоит утверждение, в левой - условия, которые проверяются на истинность.

    <утверждение1> :- <условие1>, <условие2>. % правило 1

    <утверждение1> :- <условие1>; <условие2>. % правило 2

Последовательность проверки утверждений, объединенных лексическим И (,) соответствует обходу вложенных циклов или многоуровневых списков Word.

    |  3  |__2__|  |
    |______________|

Последовательность проверки утверждений, объединенных лексическим ИЛИ (;) соответствует проследовательной записи.

    |___3___|

    |___2___|

GOAL (область запросов)

Запрос содержит одну или несколько целей (обычно - структур), объединенных И, ИЛИ. Заканчивается точкой.

<цель1>,<цель2>;<цель3>. % запрос

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

Технология разработки программы с неркурсивными правилами

Пример: разработать программу, анализирующую основные виды соединений двухполюсников в схеме.

  1. Графическая интерпретация

Элемент характеризуется:

  • Наименованием
  • Обозначением на схеме
  • Полюсами подключения

Виды соединения:

  • Общий узел
  • Звезда (не менее трех элементов)
  • Параллельное соединение
  • Последовательно соединение

[изображение схемы]

  1. Формирование исходных данных

Опишем все элементы схемы. Введем пользовательский предикат - структуру вида: элемента(наименование, обозначение, узел1, узел2), гдк первые два аргумента - символьные, а вторые два - целочисленные.

PREDICATES

nondeterm элемент(symbol, symbol, integer, integer)

CLAUSES

элемент(резистор, r1, 1, 2). % факт1
элемент(резистор, r2, 2, 3). % ф2
элемент(конденсатор, с1, 1, 4). % ф3
элемент(конденсатор, с2, 3, 6). % ф4
элемент(источник, r1, и1, 2, 5). % ф5
элемент(лампочка, r1, л1, 4, 5). % ф6
элемент(лампочка, r1, л2, 5, 6). % ф7
элемент(катушка, r1, к1, 4, 5). % ф8
элемент(катушка, r1, к2, 5, 6). % ф9

Тестирование:

GOAL

% 1 тест

элемент(резистор, r2, 2, 3). % запрос1

% есть ли в схеме элемент с наименованием "резистор",
% обозначением "r2", первым узлом 1 и вторым узлом 2?'

Пошаговое выполнение программы:

  1) факт1 v запрос1        FALSE
      элемент v элемент     true
            4 v 4           true
     резистор v резистор    true
           r1 v r2          false

  2) факт2 v запрос1        TRUE
             ...
           r2 v r2          true
            2 v 2           true
            3 v 3           true

Ответ - истина.

GOAL

% 2 тест

элемент(резистор, Обрзначение, _, _). % запрос2

% какие обозначения на схеме имеют элементы с наименованием "резистор"?'

Пошаговое выполнение программы:

  1) факт1 v запрос2          TRUE
          ...
      Обозначение(=_) v r1    true
                     <= (конкретизация)
                    _ v 1     true
                    _ v 2     true

    Получено первое решение.

После нахождения первого решения конкретизация r1 отправляется в стек, переменная Обозначение теряет конкретизацию. Продолжается поиск решений.

Итоговый ответ: два решения (r1, r2).

GOAL

% 3 тест
% запрос 3: <цель1>,<цель2>,<цель3>

элемент(_, Обрзначение1, 4, 5),
элемент(_, Обрзначение2, 4, 5),
Обрзначение1 < > Обрзначение2. % запрос3

% какие обозначения на схеме имеют элементы с узлами подключения 4, 5?'

Пошаговое выполнение программы:

  1) факт1 v цель1          FALSE
          ...
  6) факт6 v цель1          TRUE
          ...
      Обозначение1(=_) v л1    true   
                      <= (конкретизация)

  % Получено первое решение для цель1.

  % Согласно очередности обхода запроса с логическим И (вложенный цикл),
  % переходим к цель1 и проверяем, начиная с факт1.

  7) факт1 v цель2          FALSE
          ...
  12) факт6 v цель2         TRUE
          ...
      Обозначение2(=_) v л1    true  
                       <= (конкретизация)

  % цель1 и цель2 дали истину, теперь проверяется цель3

  13) Обозначение1(= л1) < > Обозначение2(= л1)      FALSE   

  % цель3 не выполнена. Переменная Обозначение2 теряет конкретизацию.
  % Продолжается поиск решений для цель2.

  14) факт7 v цель2          FALSE
           ...

  В итоге получим следующие решения:

  Обозначение1 = л1   Обозначение2 = к1
  Обозначение1 = к1   Обозначение2 = л1

Разработка правилам

Определение иерархии правил - от простого к сложному.

  1. Разработка празила "общий узел"
  • разработка частного правила (для конкретного узла с константами)

Логическая модель: должна содержать одно утверждение и одно условие.

Введем новый пользовательский предикат.

PREDICATES

nondetern общий_узел(symbol, symbol, integer).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment