Скачиваний:
201
Добавлен:
17.06.2016
Размер:
2.69 Mб
Скачать

Равенство и предикат равенства

В Турбо Прологе такие операторы, как N = N1-2 показывают отношение

между тремя объектами (N,N1 и 2) или отношение между двумя объектами (N и

величеной N1-2). Если N еще свободно, оператор может быть удовлетворен

присвоением N значения выражения N1-2. Это приблизительно соответствует

тому, что в других языках програмирования называется оператором присваи-

вания. Заметим, что поскольку N1 является частью вычисляемого выражения

оно всегда должно быть определено (то есть должно быть связано со значе-

нием).

Когда вы для сравнения вещественных величин используете предикат ра-

венства (=), нужно позаболиться о том, чтобы приближенное представление

вещественных чисел не привело к непредсказуемым результатам. Например,

цель:

7/3*3=7

потерпит неудачу. Это показывает, что сравнивая две вещественные величины

на равенство, лучше проверять, чтобы они не имели разное представление.

Пример

------

Программа CH11EX02.PRO показывает как обработать приблизительное ра-

венство. Она представляет собой итеративную процедуру вычисления квадрат-

ного корня, для определения решений квадратного уравнения:

A*X*X + B*X + C = 0

Наличие решений зависит значения дискриминанта D, определяемого как:

D = B*B - 4*A*C

- D > 0 означает, что существует два различных решения.

- D = 0 означает, что существует единственное решение.

- D < 0 означает, что решений нет, если X-вещественное (могут

быть одно или два комплексных решения ).

/* Программа CH11EX01.PRO - рашает квадратное уравнение */

predicates

solve (real,real,real)

reply (real,real,real)

mysqrt (real,real,real)

equal (real,real)

clauses

solve (A,B,C) :-

D=B*B-4*A*C

reply(A,B,C),nl

reply(_,_,D) :-

D<0,write ("Нет решений"),!.

reply(A,B,D) :-

D=0,X=-B/(2*A),write ("x=",X),!.

reply(A,B,D) :-

mysqrt(D,D,SqrtD),

X1=(-B+sqrt D)/(2*A),

X2=(-B-sqrt D)/(2*A)

write ("x1=",X1,"and x2 =",X2).

mysqrt(X,Guess,Root) :-

NewGuess=Guess-(Guess*Guess-X)/(2/Guess)

not(equal(NewGuess,Guess)),!,

mysqrt (X,NewGuess,Root).

mysqrt(_,Guess,Guess).

equal(X,Y) :-

X/Y>0.99999,x/y<1.00001.

Чтобы решить квадратное уравнение эта программа вычисляет квадратный

корень из дискриминанта D. Программа вычисляет квадратные корни по итера-

тивной формуле, где новое значение (NewGuess) квадратного корня от X мо-

жет быть получено из предыдущего значения (Guess):

NewGuess=Guess-(Guess*Guess-X)/(2/Guess)

Каждая итерация немного приближается к квадратному корню от X. Когда

условие equal (X,Y) удовлетворяется, дальнейшего приближения достичь

нельзя и вычисление заканчивается. Программа может вычислить X1 и X2.

X1=(-B+sqrt D)/(2*A)

X2=(-B-sqrt D)/(2*A)

Соседние файлы в папке Документация