Я создаю веб-язык программирования, частично вдохновленный Prolog и Haskell (не смейтесь).
У него уже довольно много функциональности, вы можете проверить прототип на http://www.lastcalc.com/. Вы можете увидеть источник здесь и прочитать об архитектуре здесь, Помните это прототип.
В настоящее время LastCalc не может упростить выражения или решить уравнения. Вместо того, чтобы жестко кодировать это в Java, я хотел бы улучшить базовый язык, чтобы его можно было расширить, чтобы делать эти вещи, используя только сам язык (как и в Prolog). В отличие от Prolog, LastCalc имеет более мощный алгоритм поиска, Prolog - это "поиск по глубине с обратным трассировкой", LastCalc в настоящее время использует эвристический поиск в первую очередь.
Прежде чем углубиться в это, я хочу больше узнать о том, как другие системы решают эту проблему, в частности Mathematica/Wolfram Alpha.
Я предполагаю, что идея, по крайней мере в общем случае, заключается в том, что вы даете системе кучу правил для манипулирования уравнениями (например, a*(b+c) = a*b + a+c
) указать цель (например, изолировать переменную x), а затем освободить ее.
Итак, мои вопросы:
- Правильно ли мое предположение?
- Какова стратегия поиска для применения правил? например. сначала глубина, сначала ширина, глубина с итеративным углублением, какой-то лучший из первых?
- Если это "лучший первый", какие эвристики используются для определения того, может ли конкретное приложение правил приблизиться к нашей цели?
Я также был бы признателен за любые другие советы (кроме "сдаться" - я регулярно игнорирую этот совет, и это хорошо мне помогло;).