Вернемся к "хитростям"...
В одной из старых советских книг предлагались следующие способы сделать запросы к БД более лаконичными.
1) множество значений характеристик должность == инженер, техник, завлаб,...; фамилия == Иванов, Петров,...; зарплата == 100-500; год рождения == 1920-1985; 2) описание самоидентифицирующихся значений красный -> цвет; инженер, лаборант -> должность; 3) приписывание семантической ориентации моложе == =<(возраст); выше == =>(зарплата, рост, производительность); снс == =зн(должность); 4) выделение определяющих атрибутов инженер == сотрудник | должность = инженер; комсомолец == сотрудник | партийность = ВЛКСМ; 5) указание специфицирующего набора характеристик сотрудник == (фамилия, имя, отчество, должность); подразделение == (название); 6) введение синонимов зарплата == оклад; сотрудник == кто; 7) определение словосочетаний общие сведения == фамилия, имя, отчество, год-рождения, должность, группа; 8 ) описание значения атрибутов научный сотрудник == снс/мнс/завниг; темный == черный/синий/коричневый/фиолетовый.
Очевидно, что все пункты, кроме (2) выглядят вполне по-фортеровски: возможность макро-определения одних слов-предикатов через другие.
А как быть с "самоидентифицирующимися значениями" т.е. с восстановлением предиката, по константе?
Чтобы "ЦВЕТ СИНИЙ" значило то же, что и "СИНИЙ", но, разумеется, оставалась возможность написать "ОТТЕНОК СИНИЙ".
Т.к. FORTH позволяет все, то, очевидно, возможны самые разные варианты.
Допустим, для определенности, предикаты записываются в виде ": ПРЕДИКАТ ВЫЧИСЛЯТОР ПРОВЕРЯТОР ;", где ВЫЧИСЛЯТОР получает текущее значение (поля БД), а ПРОВЕРЯТОР проверяет его соответствие условию. Т.е. ЦВЕТ - ВЫЧИСЛЯТОР, а СИНИЙ - ПРОВЕРЯТОР.
(Возвращаясь к пунктам (1 и 3-8) видим, что их можно рассматривать как конструктор из ВЫЧИСЛЯТОРОВ и ПРОВЕРЯТОРОВ).
Очевидное решение пункта (2) - проверка словом СИНИЙ флага выполнения ВЫЧИСЛЯТОРА. Или даже (используя нечеткую логику, раз уж речь идет о понимании естественного языка), поиск наиболее подходящего ВЫЧИСЛЯТОРА для данного ПРОВЕРЯТОРА.
Есть ли в FORTH более естестсвенные решения? Как сообщить слову о том, что от него хотят что-то необычное? Очевидно, используя словари. ВЫЧИСЛЯТОР должен быть словарем.
Т.е. СИНИЙ, лежащий в словаре ЦВЕТ берет значение поля "цвет", а в словаре ОТТЕНОК - поля "оттенок". СИНИЙ, лежащий в корневом словаре, идентичен "цветному". (Или наш словарь настолько умен, что позволяет перенести СИНИЙ из словаря ЦВЕТ в корневой, при обявлении его "самоидентифицирующимся").
Понятно, не хочется плодить одинаковые имена, при этом возникает идея наличия в словарях более неоднозначного соответствия "имя-связь-код" : "одно имя с несколькими связями но одинаковым кодом" и/или "одно имя с несколькими связями, причем, у каждой свой код". Или проще, хранение в словаре не имени, а ссылки на имя.
Неприятность при таком подходе поджидает при наличии в предикате более одного ВЫЧИСЛЯТОРА. Например, "ИМЯ1 ИМЯ2 ТЕЗКИ".
Т.е. надо иметь четыре словаря для "ИМЯ1 ИМЯ2 ТЕЗКИ", "ИМЯ1 ТЕЗКИ", "ИМЯ2 ТЕЗКИ" и "ТЕЗКИ" (2 в степени N для N ВЫЧИСЛЯТОРОВ, не считая варианта с перестановками - "ИМЯ2 ИМЯ1 ТЕЗКИ"). Т.е. в словаре ИМЯ1 должно быть слово ИМЯ2, тоже являющееся словарем. Но, самое смешное, если мы готовы записывать в словари не имена, а лишь ссылки на них (и косвенный шитый код), это даже не вызовет особых накладных расходов.
Т.о. мы приходим к разделению словаря на отдельные части: стековую (код), строковую (имена) и списковую. Это, например, может быть полезно в случае, когда набор операций (слов) некоторого подмножества машин фиксирован, но код этих слов различен.
|