2013-04-12 5 views
5

Предположим, у меня есть число X и я хочу, чтобы решить систему уравнений, скажем, Y + Z = X, Z * Y = 1.Решая систему уравнений в Прологе

Теперь это имеет решения Y = 1/Z и Z = (sqrt (X * X-4) + X)/2 или (X- (sqrt (X * X-4)))/2.

Так что я могу писать в Прологе:

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. 

Это работает.

НО

это требует много предварительной работы с моей стороны, по существу, решая его заранее и просто прошу Пролог оценить ответ.

Есть ли способ получить Z и Y, не решив X заранее?

Я не могу просто написать такие вещи, как

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

из-за ошибки экземпляра.

+0

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

ответ

3

Я думаю, что вам понадобится CAS, чтобы символически решить систему, как вы «вручную». Такой SW нелегко найти и построить.

Если прагматичный подход может сделать это для вас, библиотека (clprq) может помочь:

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

дает

?- 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}. 

это имеет смысл?

+1

Не совсем, если честно, но я думаю, что я мог бы написать решателя для второй степени полином, а затем использовать это. Но все равно спасибо. – Valtteri

+0

Почему такое программное обеспечение трудно найти? Разве это не существует? Разве это не существует для Prolog? –

+0

@ErikAllik: это довольно сложная тема, и я не знаю сайта, откуда можно скачать CAS. По крайней мере, в книге (google for the Art of Prolog, Sterling-Shapiro) CAS был предметом главы, возможно, стоило бы реализовать ее как отправную точку ... – CapelliC