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




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


        счетчик( А, [ _ | 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.




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