19

Buduję internetowy język programowania częściowo zainspirowany przez Prolog i Haskell (nie śmiejcie się).W jaki sposób system taki jak Wolfram Alpha lub Mathematica rozwiązuje równania?

Ma już sporo funkcjonalności, możesz sprawdzić prototyp pod numerem http://www.lastcalc.com/. Możesz zobaczyć źródło here i przeczytać o architekturze here. Pamiętaj, że to prototyp.

Obecnie LastCalc nie może uprościć wyrażeń ani rozwiązać równań. Zamiast trudnego kodowania tego w Javie, chciałbym rozszerzyć podstawowy język, tak aby można go było rozszerzyć, aby robić te rzeczy, używając tylko samego języka (tak jak w Prologu). W przeciwieństwie do Prologu, LastCalc ma mocniejszy algorytm wyszukiwania, Prolog jest "pierwszym wyszukiwaniem w głębi z wstecznym śledzeniem", LastCalc obecnie używa heurystycznego najlepszego pierwszego wyszukiwania.

Zanim przejdziemy do tego tematu, chcę lepiej zrozumieć, jak inne systemy rozwiązują ten problem, w szczególności Mathematica/Wolfram Alpha.

Zakładam, że pomysł, przynajmniej w ogólnym przypadku, polega na tym, że dajesz systemowi kilka reguł do manipulowania równaniami (np. a*(b+c) = a*b + a+c) określ cel (np. Izoluj zmienną x), a następnie pozwól mu stracić.

Więc moje pytania to:

  • Czy moje założenie jest poprawne?
  • Jaka jest strategia wyszukiwania dla stosowania reguł? na przykład. Głębokość pierwsza, szerokość pierwsza, głębokość pierwsza z iteracyjnym pogłębieniem, coś w rodzaju najlepszego najpierw?
  • Jeśli jest to "najlepsza pierwsza", jakie heurystyki są używane w celu ustalenia, czy jest prawdopodobne, że konkretna aplikacja reguły zbliżyła nas do naszego celu?

Chciałbym również docenić wszelkie inne porady (z wyjątkiem "poddaj się" - regularnie ignorować tę radę i robi to dobrze mi służył;).

+9

proszę, nie to jak szeroki zbyt blisko ... er, na odwrót. Jest to interesujące i odpowiedzialne - a poza tym znajdź niektóre z tych "gimme teh codez" lub "why does" "foo" [0] = 'b'; 'segfault?" pytania, twoje CV będzie służyć tam o wiele lepiej. –

+0

Czy pytasz o rozwiązywanie równań lub analizowanie parsowania? "rozwiązać 150sin (x) -gamma (x) = 0" to jedna rzecz, "parsować (((((x + 1) -1) +1) -sin (x) -1))" to jednak inna rzecz pierwszy może obejmować drugi. – hexafraction

+0

Dobre pytanie. LastCalc jest dość dziwny, ponieważ wszystko, co robi, czy parsowanie, konwersja jednostek, czy (wkrótce) upraszczanie wyrażeń i rozwiązywanie równań, to tylko seria transformacji - punktem wyjścia jest lista tokenów. Jednak parsowanie nie jest wyzwaniem, dlatego skup się na rozwiązywaniu, a nie analizie. – sanity

Odpowiedz

10

Sam sobie z takimi pytaniami radziłem sobie jakiś czas temu. Następnie znalazłem this document o uproszczeniu wyrażeń. Jest on nazwany oparte na regułach uproszczenie wyrażeń i pokazuje kilka szczegółów dotyczących upraszczania w Mupadzie, który później stał się częścią Matlaba.

Zgodnie z tym dokumentem twoje założenie jest prawidłowe. Istnieje zestaw reguł do manipulacji wyrażeń. Metryka heurystycznej jakości jest używana jako funkcja docelowa do uproszczenia.

+0

Bardzo pomocna, dziękuję. Niestety jest to mniej więcej to, czego się spodziewałem, a może to jest szczęście, nie jestem pewien :-) – sanity

+0

Nie znaleziono :(Czy wiesz, gdzie może być obecny link? – Uzebeckatrente

2

Wolfram alfa opracowany przez Mathematicą

  • Mathematica jest pomysłem stephen wolphram'S. Mathematica 1.0 została wydana w 1988 roku. Matematyka jest bardzo podobna do klonu i obie opierają się głównie na starszych bibliotekach oprogramowania, takich jak LaPack.
  • Biblioteki tych programów są oparte na, i często po prostu, starszym oprogramowaniu. Byli w pobliżu i modyfikowani przez bardzo długi czas.

Jeśli chcesz dowiedzieć się więcej o uruchomionych programach działających w tle, sagemath jest darmową alternatywą open source; można było możliwe inżynierii wstecznej rozwiązań pytania: ludzi

SageMath.org