На этом шаге мы рассмотрим преобразования типов.
На этом шаге мы рассмотрим стандартные предикаты, предназначенные для преобразования типов. Это предикаты char_int, str_char, str_int, str_real, upper_lower.
Предикат char_int преобразует символ в целое число или целое в символ и имеет формат:
char_int(Char,Integer) % (i,o), (o,i), (i,i)
Если оба аргумента связаны, то char_int проверяет, соответствуют ли значения аргументов. Если один аргумент связан, а другой свободен, char_int выполняет преобразование и связывает выходной параметр с преобразованной формой входной параметра.
Предикат str_char преобразует строку, содержащую один и только один символ, в символ или символ в строку из одного символа; предикат имеет формат:
str_char(String,Char) % (i,o), (o,i), (i,i)
В случае если поток параметров - (i,i), то предикат str_char завершается успешно, если при этом String связан со строкой из одного символа, который соответствует Char. Если длина строки - не единица, то str_char завершается неуспешно.
Предикат str_int преобразует строку, содержащую целое число, в его текстовое представление и имеет формат:
str_int(String,Integer) % (i,o), (o,i), (i,i)
В случае если поток параметров - (i,i), то str_int завершается успешно, при условии, что Integer связан с целым эквивалентом числа, представленного с помощью String.
Предикат str_real преобразует строку в вещественное число или вещественное число в строку и имеет формат:
str_real(String,Real) % (i,o), (o,i), (i,i)
В случае если поток параметров - (i,i), то str_real завершается успешно, если Real связан с вещественным числом, равным числу, представленному в String.
Предикат 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).
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
predicates p(integer) clauses p(X):- write("The integer value is ",X,'\n').
Следующие цели дадут одинаковый эффект в этом примере:
Х=97.234, р(Х). Х=97, р(Х). Х='а', р(Х).
На следующем шаге мы рассмотрим внутренюю базу фактов.