2013-04-12 15 views
5

Załóżmy mam numer X i życzę, aby rozwiązać układ równań, powiedzmy Y + Z = X, Z * Y = 1.Rozwiązując układ równań w Prologu

Teraz ma to rozwiązania Y = 1/Z i Z = (sqrt (X * X-4) + X)/2 lub (X- (sqrt (X * X-4)))/2.

Więc mogę napisać w Prologu:

solve(X,Y,Z):- Y is (sqrt(X*X-4)+X)/2, Z is 1/Y. 
solve(X,Y,Z):- Y is (X-(sqrt(X*X-4)))/2,Z is 1/Y. 

To działa.

ALE

to wymaga wiele wstępnych prac z mojej strony, zasadniczo rozwiązywania go wcześniej i zadaje Prolog ocenić odpowiedź.

Czy jest jakiś sposób, aby uzyskać Z i Y, bez uprzedniego rozwiązania X?

Nie mogę po prostu pisać takie rzeczy

solve(X,Y,Z):- X is Y+Z, Z is 1/Y. 

powodu błędu konkretyzacji.

+0

http://stackoverflow.com/questions/13690136/im-curious-if-logical-program-can-do-algebra –

Odpowiedz

3

Myślę, że potrzebujesz CAS, aby symbolicznie rozwiązać system, tak jak zrobiłeś "ręcznie". Taki SW nie jest ani łatwy do znalezienia, ani do zbudowania.

Jeśli pragmatyczne podejście może zrobić dla ciebie, biblioteka (clprq) może pomóc:

:- [library(clpr)]. 
solve(X,Y,Z) :- {Y+Z=X, Z*Y=1}. 

daje

?- solve(3,Y,Z). 
{Z=3.0-Y, -1.0+Z*Y=0.0}, 
{-1.0+Z*Y=0.0}, 
{-1.0+Z*Y=0.0}. 

Czy to ma sens?

+1

Niezupełnie, szczerze mówiąc, ale myślę, że mógłbym napisać solver dla drugiego stopnia wielomian, a następnie użyj tego. Ale i tak dzięki. – Valtteri

+0

Dlaczego takie oprogramowanie jest trudne do znalezienia? Czy to nie istnieje? Czy nie istnieje dla Prolog? –

+0

@ErikAllik: jest to dość trudny temat i nie znam strony z której można pobrać CAS. Przynajmniej w książce (google o sztuce Prologa, Sterling-Shapiro), CAS był tematem rozdziału, może warto byłoby go za punkt wyjścia ... – CapelliC