У меня были значительные проблемы, пытаясь понять, почему мои массивы не работали должным образом. Функционально я использовал тот же код, что и приведенный ниже, но в моей программе он незаметно давал сбой, поэтому я написал изолированный тестовый пример, используя те же типы данных и синтаксис, и получил ошибки о недопустимых типах смещения.
Warning: Illegal offset type in <file location>\example.php on line 12
Warning: Illegal offset type in <file location>\example.php on line 16
Они относятся к двум строкам, содержащим ссылку на «$ questions [$ question]».
В настоящее время я участвую в проекте по разработке приложения, способного рассматривать набор узлов и соединений и находить кратчайший путь (распространенная и хорошо известная проблема) между двумя узлами (при разрешенных соединениях). Что ж, мне действительно не нужно создавать приложение с нуля, мне просто нужно «преобразовать» уже существующее приложение Prolog в f #. Я подумал, что немного об этом подумал и, наконец, задал себе один вопрос: «Вместо разработки специального решения и реализации новых алгоритмов, специально привязанных к этой проблеме, могу ли я создать программу, способную принимать факты, такие как Пролог, и использовать их для создания запросов или чего-то еще. подобное? ".
Поступая так, я бы создал набор фактов (как в Прологе), а затем использовал бы их для создания запросов. Итак, учитывая теперь эту новую проблему (преобразование Пролога в F #), мне нужно найти способ создавать факты, подобные этим:
myfact1(el1, el2,..., eln).
myfact2(el1, el2,..., elm).
...
myfactk(el1, el2,..., elp).
, для чего-то с похожим синтаксисом, например:
fact factname1: el1 el2 ... eln;
fact factname2: el1 el2 ... elm;
...
fact factnamek: el1 el2 ... elp;
Я знаю, что F # очень хорошо подходит для синтаксического анализа, поэтому Я думаю, что разбор этого, вероятно, не будет проблемой.
Хорошо! Теперь, когда он проанализирован, я должен определить алгоритм, который при синтаксическом анализе кода сохраняет все факты в виде какого-то знания (не более чем таблицы). Для создания всех необходимых ассоциаций.
Например, решением может быть хеш-таблица, которая учитывает все ассоциации
factname1 -> el1
factname1 -> el2
...
factname1 -> eln
factname2 -> el1
factnale2 -> el2
...
factname2 -> elm
factname3 -> el1
...
...
factnamek -> el1
factnamek -> el2
...
factnamek -> elp
Поступая таким образом, я всегда смогу решать запросы. Например, рассмотрим следующий факт Пролога
mother(A, B) % This means that A is mother of B
mother(C, D)
В F # я создаю
мать факта: AB; факт мать: CD;
Моя хеш-таблица:
мать -> A | B мать -> С | D
Первый столбец - это имя факта, а второй - значение (здесь кортеж).
Если я хочу выполнить поиск: "кто мать B" -> я ищу мать и смотрю для значения я нахожу B, смотрю в кортеж и нахожу A!
Ну, похоже, работает. Но факты легко реализовать. А как насчет правил? Например, родители правила:
parents(A, B, C) :- mother(A, C), father (B, C)
В F # использовать мой синтаксис? Что ж, мне в голову пришла такая идея:
rule parents: A, B, C => mother A C and father B C
Когда мой синтаксический анализатор обнаруживает правило, что он должен делать? Я хотел бы создать какую-то запись в таблице, как это сделал я, и иметь возможность позже делать запросы, чтобы указать предмет и получить его родителей или указать отца и получить всех сыновей и так далее ... Что бы вы сделали?