На этом шаге мы рассмотрим преобразования типов.
На этом шаге мы рассмотрим стандартные предикаты, предназначенные для преобразования типов. Это предикаты 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, р(Х). Х='а', р(Х).
На следующем шаге мы рассмотрим внутренюю базу фактов.