Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пролог =).doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
1.69 Mб
Скачать

Запоминание состояния в Прологе.

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

Передача может быть :

  • immutable (неизменной)

  • mutable (переменной)

immutable G(.. , S, ..):- g(.. , S, ..), .. h(.. , S, ..).

mutable добавляется пара: "старое значение, новое значение" иногда называют : "аккомулирующие пары"

G(.. , S0,Sn):-

g(.. , S0,S1),

...

h(.. , Sm,Sn).

Length([],L,L).

Length([_|List],L0,L):-

L1 is L0+1,

Length(List,L1,L).

Аналогично для dcg проводится

  • Для одной цели

  • P(X)-->G(X).

  • P(X,S0,S):-G(X,S0,S).

  • Для нескольких целей

  • P(X,Y)-->G(X),

  • R(X,Y),

  • S(Y).

  • P(X,Y,S0,S):-G(X,S0,S1),

  • R(X,Y,S1,S2),

  • S(Y,S2,S).

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

При этом каждый предикат дополняется двумя аргументами. Первый аргумент заголовка правила представляет анализируемую цепочку. Он передается в качестве первого аргумента первой подцели.

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

Например правую

noun_phrase(N) -> article(N), noun(N).

Заменяет на

noun_phrase(N,S0,S2) -> article(N,S0,S1), noun(N,S1,S2).

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

Интерпретация рассмотренного правила такова :

Список S0 начинается с noun_phrase(N), а S2 это то что остается от S0 после удаления из него noun_phrase(N), если :

  • Cписок S0 начинается с article(N), а список S1 - это то, что остается от S0 после удаления артикля,

  • Cписок S1 начинается с noun(N), а список S2 - это то, что остается от S1 после удаления noun(N).

Грамматическое правило, которое раскрывает символ, заменяя его на терминальный символ, преобразуется в правило Пролога, тело которого представляет собой вызов встроенного предиката 'C', имеющего следующее определение : 'C'/3 Цель успешно согласуется, если ее первый аргумент - список, а второй - голова этого списка, а третий - его хвост.

article(singular):-'c'(s0,the,s1)

Пример преобразования грамматического правила DCG:

p-- > q, [r], t, [u]. p(s0,s4):-q(s0,s1), 'c'(s1,r,s2),t(s2,s3),'c'(s3,u,s4).

11.1. Постановка задачи

Задача о кувшинах воды состоит в следующем:

В кувшин А вмещается 5 литров, а в кувшин B входит 2 литра.

При старте 5-литровый кувшин полный, вы можете лить воду

из одного кувшина в другой или на землю, полностью наполнять

кувшины водой. Это делается до тех пор пока

вы не уверены, что кувшин B содержит ровно 1 литр.