Cтраница 2
Ассоциативный список превращается в обычный магазин значений внутренних переменных. Рабочие подпрограммы становятся короче и работают быстрее. [16]
Ассоциативный список, как уже было сказано в разд. Традиционная структура ассоциативного списка и функции для работы с ним описаны ниже ( см. разд. При желании нетрудно перевести описания этих функций на машинный язык. [17]
Ассоциативный список служит для запоминания связи между наименованиями переменных и их активными и пассивными значениями. Во многих реализациях языка ассоциативный список организуется так, как это описано в разд. [18]
Запись, представляющая комнату, является заголовком ассоциативного списка сотрудников, работающих в этой комнате. [19]
Пусть ячейка aptr содержит адрес первой свободной ячейки ассоциативного списка, ячейка abeg - наименьший возможный адрес ( адрес начала) этого списка, ячейка aend - наибольший возможный адрес. [20]
В ней описывается и используется вспомогательная процедура ИСКЛ исключения записи о сотруднике из одного ассоциативного списка. Как и в процедуре ВКЛ, параметром этой вспомогательной процедуры является указатель k места ссылок, относящихся к данному ассоциативному списку. [21]
В этой главе мы коротко повторим эти понятия и подробнее опишем основанную на списках и точечных парах структуру данных - ассоциативный список ( association list), или список пар. [22]
Подпрограмму evfal мы детально не описываем, так как она довольно громоздка, но основана на уже известных принципах. Анализируя значение своего первого аргумента, она должна создать мостик ( возможно, тривиальный - на предыдущую ячейку ассоциативною списка), занести в ассоциативный список наименования связанных переменных функционального аргумента, выполнить его тело ( с помощью call или eval, а может быть, - evcomp или еоехрг, если функциональный аргумент был задан не определяющим выражением, а наименованием функции) и восстановить значения указателей aptr и base, если они были испорчены. [23]
В а-указатели этих ячеек, так же как в режиме интерпретации, заносятся наименования переменных, точнее - представляющие их адреса информационных ячеек атомов. Но значение, связанное с г - й переменной xit как правило, разыскивается не по ее наименованию, а по номеру г. Чтобы это было возможно, используется специальная переменная base, которой присваивается значение aptr указателя ассоциативного списка непосредственно перед размещением переменных. При этом значение переменной х попадает в d - указатель ячейки ассоциативного списка с адресом base cit где Ci линейно зависит от г, так что доступ к этому значению возможен с помощью операции cdr ( base - - ci), а точнее - с помощью соответствующих ей машинных команд. В дальнейшем будем считать, как мы это уже делали в разд. [24]
Среди ячеек, содержащих пары переменная-значение, могут быть вкраплены ячейки, а-указатель которых содержит адрес nil, а d - указатель - адрес одной из предшествующих ячеек ассоциативного списка. Если в процессе поиска значения переменной встречается такая ячейка, то поиск продолжается с места, указанного в ее d - указателе. Благодаря этому создается возможность обходить некоторые участки ассоциативного списка. Это необходимо в некоторых случаях при работе с функционалами ( см. разд. [25]
В а-указатели этих ячеек, так же как в режиме интерпретации, заносятся наименования переменных, точнее - представляющие их адреса информационных ячеек атомов. Но значение, связанное с г - й переменной xit как правило, разыскивается не по ее наименованию, а по номеру г. Чтобы это было возможно, используется специальная переменная base, которой присваивается значение aptr указателя ассоциативного списка непосредственно перед размещением переменных. При этом значение переменной х попадает в d - указатель ячейки ассоциативного списка с адресом base cit где Ci линейно зависит от г, так что доступ к этому значению возможен с помощью операции cdr ( base - - ci), а точнее - с помощью соответствующих ей машинных команд. В дальнейшем будем считать, как мы это уже делали в разд. [26]
Допустим, функция F обращается к функциям G и Я, у которых есть сходные по своему назначению переменные. Над этими переменными при выполнении функций G и Н требуется произвести одни и к же действия, которые могут быть описаны с помощью функции К. Если требуется, чтобы при этих действиях значения переменных не только использовались, но и менялись, то они могут быть только внешними в / С. При этом в G и Я они должны быть обозначены одинаково, так что при компиляции функции / С даже нельзя установить, переменные какой из двух функций учьствуют в операциях. Если каждый атом, выступающий в роли внешней переменной в какой-нибудь функции, является внутренней переменной в точности одной функции, то в принципе во время компиляции можно реализовать механизм, определяющий адрес хранения значения этой переменной, но едва ли этот механизм будет проще ассоциативного списка. [27]
Система находится на стадии действующего прототипа. Областью экспертизы является диагностика внутренних болезней человека. Система содержит информацию о 500 болезнях, что составляет примерно 807с всех известных терапевтических заболеваний. База данных CADUCEUS - самая большая среди баз данных существующих экспертных систем. Проблема постановки диагноза осложняется тем, что пациент может быть болен несколькими болезнями одновременно. В системе хранятся знания приблизительно о 100000 ассоциативных связях между симптомами и болезнями. Система используется в клинической практике и для обучения студентов-медиков. Качество решений системы высокое. Между этими типами данных установлен ряд отношений. Каждой болезни сопоставлен ассоциативный список ее проявлений. Существует и обратный список, т.е. для каждого проявления указаны болезни, при которых оно встречается. Болезни организованы в иерархическое дерево, а также связаны причинными, временными и ассоциативными отношениями. Знания представляются в виде сетей с использованием коэффициента определенности. [28]