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



     На www.zenner-center.ru счетчики воды zenner. |     

Предикаты var, nоnvar, atom, integer, atomic - часть 3


                N is N1 + 1.

        счетчик( А, [ _ | L], N) :-

                счетчик( A, L, N).

Теперь на нескольких примерах посмотрим, как эта процедура работает:

        ?-  счетчик( а, [а, b, а, а], N).

        N = 3

        ?-  счетчик( a, [a, b, X, Y], Na).

        Na = 3

        . . .

        ?-  счетчик( b, [a, b, X, Y], Nb).

        Nb = 3

        . . .

        ?-  L=[a, b, Х, Y], счетчик( а, L, Na), счетчик( b, L, Nb).

        Na = 3

        Nb = 1

        X = a

        Y = a

        . . .

В последнем примере как X, так и Y после конкретизации получили значение а, и поэтому Nb оказалось равным только 1, однако мы хотели не этого. Нас интересовало количество реальных появлений конкретного атома, а вовсе не число термов, сопоставимых с этим атомом. В соответствии с этим более точным определением отношения счетчик мы должны теперь проверять, является ли голова списка атомом. Усовершенствованная программа выглядит так:

        счетчик( _, [ ], 0).

        счетчик( А, [В | L], N) :-

                atom( В), А = В,  !,                       % B равно атому А?

                счетчик( A, L, N1),

                    % Подсчет в хвосте

                N is N1 + 1;

                счетчик( А, L, N).

                                % Иначе - подсчитать только в хвосте

В следующем более сложном упражнении по программированию числовых ребусов используется предикат nonvar.




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