Я пытаюсь реализовать инфраструктуру в C #, которая позволила бы мне создавать произвольные математические выражения. Например, я хочу иметь возможность взять выражение вроде
asin (sqrt (z - sin (x + y) ^ 2))
и превратить его в объект, который позволит мне оценить его с точки зрения x, y и z, получить производные и, возможно, выполнить некоторую символическую алгебру над ним. Что думают люди о хорошей модели для этого в C #?
У меня есть своя собственная идея, которая, боюсь, направляется в архитектурную космонавтику, поэтому я хочу убедиться, что это не так.
По существу, функции типа sin, +, sqrt и т. Д. Имеют классы, основанные на базовом классе:
Function
Function<TOut> : Function
TOut Value
Function<Tin, TOut> : Function
TOut Evaluate(TIn value)
Function Derivative
Function<TOut, TIn> INverse
Function<TInA, TInB, TOut> : Function
TOut Evaluate(TInA valueA, TInB valueB)
Function PartialDerivativeA
Function PartialDerivativeB
Пока все просто. Хитрость в том, как составлять функции. Здесь я считаю, что мне нужно что-то вроде подхода с каррированием, чтобы я мог оценить функцию для одного параметра и оставить остальные. Так что я думаю о заводском классе, подобном этому:
Function<TInA, TInB, TOut> ->
Function<TInA, Function<TInB, TOut>>
(Function<TInA, TInB, TOut>, Function<TInX, TInA>, null) ->
Function<TInX, Function<TInB, TOut>>
(Function<TInA, TInB, TOut>, Function<TInA>, Function<TInX, TInY, TInB>) ->
Function<TInX, Function<TInY, TInB>>
и так далее. Мои главные опасения заключаются в том, что универсальные типы могут сделать систему непригодной для использования (если пользователь должен знать полные универсальные типы только для оценки), и что я не смогу создать все универсальные типы из входных аргументов. 1015 *
Спасибо за ваш вклад!