Левая часть продукции. Образцы:
< левая часть > :: = condition [< образцы >]
< образцы > :: = < образец > | < образец > | < образец > & < образец > | < образец > | < образец >
< образец > :: = < образец факта > | < образец - сравнение > | < образец - строка >
Образец - строка - проверка строки на непустоту.
Образец - сравнение - проверка, находятся ли 2 строки в заданном соотношении
< обр. факта > :: = [ ^ ](< шаблон имени факта > [спецификатор]: [< шаблон слотов >])
^ - выбрать всё
< шаблон имени факта > :: = * |< строка >| < П-переменная >
* сопоставляется с чем угодно
строка требует точного совпадения
П-переменная - всегда сопоставляется успешно и означивается.
< шаблон слота > :: = < шаблон имени слота > [< спец-р >]
< значение >[< cпец-р >]
< таблица имени слота > - такие же
Примеры : (*:) - любой факт. Образец сопоставляется, когда в БФ есть хотя бы один слот.
(>fact_name:) - сопоставляется всегда, в переменнную fact_name будет добавлено имя последнего занесённого в базу факта.
^(>fact_name:) - в переменную слева добавляется список всех фактов.
(факт1:) - сопоставляется, если в БФ есть факт с именем факт1.
(<< obj:*) - сопоставляется, если у переменной obj левое значение соответствует имени какого-либо факта, у кот-го есть хотя бы один слот.
(<<obj:sl<) - то же, но в переменную sl справа добавляется имя слота, созданного последним.
(Факт1 : слот3 = 5) - сопоставляется, если у факта 1 слот 3 имеет значение 5.
(Факт1 : слот3) - есть слот3 не имеет значения.
^(>>l : тип = НЕ
зн_вх1 = 1
зн_вых1 = 0 )
В переменную l слева добавляется имена всех интервалов, у которых на вх. 1, на вых. 0.
Спецификаторы могут стоять после имени слота, имени факта,
значения слота. Они налагают дополнительные ограничения, необходимые для
успеха.
< специализатор > :: = {< знак >< параметр >}
< знак > :: = <.|>|= =|!=|…
< параметр > :: = < строка >
(*{= = F1:F2}:) - в БФ есть какой-либо факт i с именами слотов F1 и F2
(>fact_name {! = “F1”}) в переменную слева добавляется имена всех фактов, кроме F1.
(>l2 : выход = 1’2’3’{!=5}
вход 1 = е2<) - есть элемент l2, у которого слот выход подключен к 1,2,3 элементу, но не подключен к 5. Сопоставляется и в переменную е2 справа добавляется номер элемента, к которому подключен 1-й вход.
Рассмотрим тот же пример, если мы хотим чтобы у того элемента, к которому подключен 1-й вход, было известно значение выхода.
(>l2 : выход = 1’2’3 {!=5}
вх 1 = е2 <
{($e2 : знач. вых = * )})
При сопоставлении такого образца в переменную $е2 справа добавляется пробное значение (5). Затем это пробное значение истолковывается как имя факта, и у 5 значения проверяется значение_выхода. Если оно означено, образец сопоставляется и значение 5 переписывается из промежуточного буфера в е2.
Образцы фактов:
^ (2:выход => е1,
{ ( $ e1: знач_вых) } )
Образец успешно составляется, если у элемента с именем 2 есть слот с именем выход, имеющий какие-либо значения. При этом все эти значения добавляются слева к переменной е1, если эти значения соответствуют именам элементов, у которых есть слоты знач_вых неозначенные. Например, пусть в е1 используют значения 7,15,22. При этом у 7-го,15-го и 22-го элементов будет предварительно наличие неозначенного слота знач_вых.
( * , тип = НЕ,
зн_вход => V1,
{ _equal ( $ V1 , 0 ) } )
Сопоставляются успешно, когда есть хотя бы один факт со слотом тип, означенный как не, означенный слот зн_входа; если это значение равно нулю, оно должно записываться слева в переполненную V1. В ряде случаев, если не надо в переполненную V1 записать 0, его м. записать непосредственно в значение слота в образец (зн_входа = 0).