Программирование на языке ПРОЛОГ для искуственного интеллекта




Решение числового ребуса с использованием nonvar - часть 3


        сумма( Nl, N2, N) :-
                cyммa1( Nl, N2, N, 0, 0, [0, l, 2, 3, 4, 5, 6, 7, 8, 9], _ ).

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

Определение отношения сумма1 можно разбить на два случая:

(1)        Все три числа представляются пустыми списками. Тогда

        сумма1( [ ], [ ], [ ], 0, 0, Циф, Циф).

(2)        Все три числа имеют какую-то самую левую цифру и справа от нее - остальные цифры. То есть, они имеют вид:

        [D1 | Nl],         [D2 | N2],         [D | N]

В этом случае должны выполняться два условия:

(а)        Оставшиеся цифры, рассматриваемые как три числа Nl, N2 и N, сами должны удовлетворять отношению сумма1, выдавая влево некоторый перенос С2 и оставляя некоторое подмножество неиспользованных цифр Циф2.

(b)        Крайние левые цифры D1, D2 и D, а также перенос С2 должны удовлетворять отношению, показанному на рис. 7.1: С2, D1 и D2 складываются, давая в результате D и перенос влево. Это условие в нашей программе формулируется в виде отношения суммацифр.

Переводя это на Пролог, получаем:

        сумма1( [D1 | N1], [D2 | N2], [D | N], С1, С, Циф1, Циф) :-
                сумма1( Nl, N2, N, С1, С2, Циф1, Циф2),



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