Основы программирования на языке Пролог



         

Основные понятия Пролога - часть 10


max3a(X,Y,Z,X):- X>=Y,X>=Z. /* если первое число больше или равно второму и третьему, то первое число - максимум */ max3a(X,Y,Z,Y):- Y>=X,Y>=Z. /* если второе число больше или равно первому и третьему, то второе число является максимумом */ max3a(X,Y,Z,Z):- Z>=X,Z>=Y. /* если третье число больше или равно первому и второму, то максимум - это третье число */

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

Применение отсечения позволит существенно сократить решение:

max3b(X,Y,Z,X):- X>Y,X>Z,!. /* если первое число больше второго и третьего, то первое число - максимум */ max3b(_,Y,Z,Y):- Y>=Z,!. /* иначе, если второе число больше третьего, то второе число является максимумом */ max3b(_,_,Z,Z). /* иначе максимум - это третье число */

Число сравнений значительно сократилось за счет того, что отсечение в первом правиле гарантирует нам, что на второе правило мы попадем только в том случае, если первое число не больше второго и третьего. В этой ситуации максимум следует искать среди второго и третьего чисел. Если ни первое, ни второе число не оказались больше третьего, значит, в качестве максимума можно взять как раз третье число, уже ничего не проверяя. Обратите внимание на то, что во втором правиле нам было не важно, чему равно первое число, а в третьем предложении участвовало только третье число. Не участвующие параметры заменены анонимными переменными.

И, наконец, самое короткое решение можно получить, если воспользоваться уже имеющимся предикатом max2. Решение будет состоять всего из одного предложения.

max3(X,Y,Z,M):- max2(X,Y,XY), /* XY - максимум из X и Y */ max2(XY,Z,M). /* M - максимум из XY и Z */

Мы записали, что для того, чтобы найти максимум из трех чисел, нужно найти максимум из первых двух чисел, после чего сравнить его с третьим числом.




Содержание  Назад  Вперед