Шаг 59.
Основы логического программирования.
Преобразования типов

    На этом шаге мы рассмотрим преобразования типов.

    На этом шаге мы рассмотрим стандартные предикаты, предназначенные для преобразования типов. Это предикаты char_int, str_char, str_int, str_real, upper_lower.

Предикат char_int/2

    Предикат char_int преобразует символ в целое число или целое в символ и имеет формат:

   char_int(Char,Integer) % (i,o), (o,i), (i,i)

    Если оба аргумента связаны, то char_int проверяет, соответствуют ли значения аргументов. Если один аргумент связан, а другой свободен, char_int выполняет преобразование и связывает выходной параметр с преобразованной формой входной параметра.

Предикат str_char/2

    Предикат str_char преобразует строку, содержащую один и только один символ, в символ или символ в строку из одного символа; предикат имеет формат:

   str_char(String,Char) % (i,o), (o,i), (i,i)

    В случае если поток параметров - (i,i), то предикат str_char завершается успешно, если при этом String связан со строкой из одного символа, который соответствует Char. Если длина строки - не единица, то str_char завершается неуспешно.

Предикат str_int/2

    Предикат str_int преобразует строку, содержащую целое число, в его текстовое представление и имеет формат:

   str_int(String,Integer) % (i,o), (o,i), (i,i)

    В случае если поток параметров - (i,i), то str_int завершается успешно, при условии, что Integer связан с целым эквивалентом числа, представленного с помощью String.

Предикат str_real/2

    Предикат str_real преобразует строку в вещественное число или вещественное число в строку и имеет формат:

   str_real(String,Real) % (i,o), (o,i), (i,i)

    В случае если поток параметров - (i,i), то str_real завершается успешно, если Real связан с вещественным числом, равным числу, представленному в String.

Предикат upper_lower/2

    Предикат upper_lower преобразует строку, все символы (или часть символов) которой являются символами верхнего регистра, в строку соответствующих символов нижнего регистра, и наоборот. Формат предиката:

   upper_lower(Upper,Lower) % (i,o), (o,i), (i,i)

    Если оба параметра связаны, то upper_lower завершается успешно, если Upper и Lower связаны со строками, которые являются конвертируемыми друг в друга. Напримеp, целевое утверждение:

   goal
      str1=samPLEstrING,
      str2=SAMpleSTRing,
      upper_lower(Str1,Str2).
успешно.


    Рассмотрим несколько примеров:

  1. Пример, приведенный ниже, определяет предикат scanner, который преобразует строку в список лексем. Лексемы классифицируются с помощью связывания функтора с каждой лексемой. В этом примере используются предикаты isname, str_int, str_char для определения природы лексемы, полученной с помощью fronttoken.
       domains
          tok=numb(integer); name(string); char(char) 
          toklist=tok*
       predicates
          scanner(string,toklist) 
          maketok(string,tok)
       clauses
          scanner("",[ ]).
          scanner(Str,[Tok |Rest]):-
             fronttoken(Str,Sym,Str1),
             maketok(Sym,Tok),
             scanner(Str1,Rest).
    
           maketok(S,name(S)):-
              isname(S).
           maketok(S,numb(N)):-
              str_int(S,N). 
           maketok(S,char(C)):-
              str_char(S,C).
       goal
          write("Enter some text:"),nl,
          readln(Text),nl, 
          scanner(Text,T_List),
          write(T_List).
    
        Текст этой программы можно взять здесь.

        Результат работы программы можно посмотреть на рис.1


    Рис. 1. Результат работы программы pro59_1.pro

  2. Преобразования между типами доменов symbol и string, а также между integer и real производятся автоматически при использовании стандартных предикатов или в процессе оценки математического выражения. Вещественные числа округляются в процессе автоматического преобразования. Пролог производит это автоматическое преобразование по мере необходимости при вызове предикатов:
       predicates 
          p(integer)
       clauses
          p(X):-
          write("The  integer value is ",X,'\n').
    
        Текст этой программы можно взять здесь.

        Следующие цели дадут одинаковый эффект в этом примере:

       Х=97.234,   р(Х). 
       Х=97,   р(Х).
       Х='а',   р(Х).
    

    На следующем шаге мы рассмотрим внутренюю базу фактов.




Предыдущий шаг Содержание Следующий шаг