Могу ли я добавлять предикаты во время выполнения?

Контекст представляет собой систему предикатов: правил и фактов, которые вместе определяют сумму, подлежащую выплате клиенту, в зависимости от его ситуации. Большинство правил и фактов известны во время компиляции, но факты о конкретной ситуации известны только во время выполнения, при обработке запроса на выплату. Я знаю, как запрограммировать систему на Mercury в случае, если все предикаты известны во время компиляции (т.е. являются частью исходного кода), но я не знаю, как вводить предикаты во время выполнения. Можно ли написать функцию, которая создает предикат с заданными параметрами, а затем иметь возможность использовать созданный предикат как часть контекста, в котором вычисляются суммы?


person Rudi Angela    schedule 16.01.2021    source источник


Ответы (1)


Я не уверен, что именно ваш вопрос.

Если при построении предиката с заданными параметрами вы спрашиваете, можете ли вы построить замыкание, содержащее ссылку на предикат в исходно скомпилированной программе и список значений ее начальных аргументов, которые создаются во время выполнения, то ответ такой: да, вы можете это сделать.

Если вы имеете в виду, можете ли вы создать во время выполнения предикат, код которого НЕ является частью исходно скомпилированной программы, то ответ будет отрицательным, вы не можете сделать это в Mercury. Однако это можно обойти,

  • запись кода нового предиката в новый модуль Mercury;
  • компиляция этого модуля в объектный код;
  • использование динамической компоновки, чтобы сделать новый объектный файл частью существующего исполняемого файла; а также
  • использование интерфейса внешнего кода для передачи указателя C целевого языка или его эквивалентов на других языках в исходный код для его вызова.

Однако этот метод не рекомендуется для тех, кто не понимает, как работает реализация Mercury, как разработчик.

person Zoltan Somogyi    schedule 10.02.2021