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



         

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


                суммацифр( D1, D2, С2, D, С, Циф2, Циф).

Осталось только описать на Прологе отношение суммацифр. В его определении есть одна тонкая деталь, касающаяся применения металогического предиката nonvar. D1, D2 и D должны быть десятичными цифрами. Если хоть одна из этих переменных еще не конкретизирована, ее нужно конкретизировать какой-нибудь цифрой из списка Циф2. Как только такая конкретизация произошла, эту цифру нужно удалить из множества доступных цифр. Если D1, D2 и D уже конкретизированы, тогда, конечно, ни одна из доступных цифр "потрачена" не будет. В программе эти действия реализуются при помощи недетерминированного вычеркивания элемента списка. Если этот элемент - не переменная, ничего не вычеркивается (конкретизации не было). Вот эта программа:

        удалить( Элемент, Список, Список) :-

                nonvar( Элемент),  !.

        удалить( Элемент, [Элемент | Список ], Список).

        удалить(Элемент, [А | Список], [А | Список1]) :-

                удалить( Элемент, Список, Список1).

Полная программа для решения арифметических ребусов приводится на рис. 7.2. В программу включены также определения двух ребусов. Вопрос к пролог-системе для ребуса про DONALD'a, GERALD'a и ROBERT'a с использованием этой программы выглядит так:

        ?-  ребус1( N1, N2, N), сумма( N1, N2, N).

line();

%  Решение числовых ребусов

сумма( N1, N2, N) :-

                            % Числа представлены в виде списков цифр

сумма1( N1, N2, N,



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