На этом шаге мы рассмотрим стандартные предикаты ввода/вывода.
Рассмотрим стандартные предикаты, предназначенные для ввода и вывода информации.
В Пролог включены три стандартных предиката для вывода. Это:
Предикат write может быть вызван с произвольным числом аргументов:
write(Param1,Param2,Param3,...,ParamN) % (i,i,i,...,i)
Эти аргументы могут быть либо константами из стандартных доменов, либо переменными. Если это переменные, то они должны быть входными параметрами.
Стандартный предикат nl (от англ. new line - новая строка) всегда используется вместе с предикатом write. Он обеспечивает переход на новую строку на экране дисплея. Например, следующие подцели:
pupil(PUPIL,CL),
write(PUPIL,"is in the",CL,"class"),
nl,
write("----------------------------").
Helen Smith is in the fourth class ------------------------------,
....,
write("List1= ",L1,",List2= ",L2)
Listl=[cow,pig,rooster],List2=[1,2,3].
sentence(subject(john),sentence_verb(sleeps))
domains
sentence=sentence(subject,sentence_verb)
subject=subject(symbol); .....
sentence_verb=sentence_verb(verb); ......
verb=symbol
clauses
......
write( " SENTENCE= ",My_sentence).
SENTENCE=sentence(subject(john),sentence_verb(sleeps))
Обратите внимание на наличие в строках обратного слэша (\). Это управляющий символ. Чтобы напечатать непосредственно символ \ (обратный слэш), вы должны ввести два обратных слэша подряд. Например, для порождения строки пути к файлу в DOS A:\PROLOG\MYPROJS\MYFILE.PRO в программе на Прологе нужно ввести a:\\prolog\\myprojs\\myfile.pro.
За обратным слэшем может следовать какой-либо из специальных символов управления печатью:
Также за обратным слэшем могут следовать до трех десятичных цифр, задающих специальный код ASCII. Однако не следует вставлять последовательность \0 в строку, если в этом нет необходимости. Пролог использует те же соглашения относительно строк, завершающихся нулем, что и язык С.
Предикат write сам по себе не предоставляет всю полноту функций управления печатью для таких сложных объектов, как, например, списки, но написать программы, которые вам их предоставят, просто. Следующие три небольших примера демонстрируют эти возможности.
Эти примеры показывают, как можно использовать предикат write для того, чтобы получить возможность выводить на печать такие объекты, как списки и сложные структуры данных.
domains
integerlist=integer*
namelist=symbol*
predicates
writelist(integerlist)
writelist(namelist).
clauses
writelist([]).
writelist([H|T]):-
write(H," "),
writelist(T).
Обратите внимание, как эта программа использует рекурсию для обработки списка. Попробуйте ввести в программу и исполнить такую цель:
writelist([1,2,3,4]).
domains
integerlist=integer*
predicates
writelist(integerlist)
write5(integerlist,integer).
clauses
writelist(NL):-
nl,
write5(NL,0),nl.
write5(TL,5) :-!,
nl,
write5(TL,0).
write5([H|T],N):-!,
write(H," "),
N1=N+1,
write5(T,N1).
write5([],_).
Если вы дадите программе такую цель
writelist([2,4,6,8,10,12,14,16,18,20,22]).
2 4 6 8 10 12 14 16 18 20 22
plus(mult(x,number(99)),mult(number(3),x))
x*99+3*x
Это называется инфиксной записью.
domains
expr=number(integer); x; log(expr);
plus(expr, expr); mult(expr, expr)
predicates
writeExp(expr)
clauses
writeExp(x):-
write(x1).
writeExp(number(No)):-
write(No).
writeExp(log(Expr)). -
write("log ("),
writeExp(Expr),
write (')').
writeExp(plus(U1, U2)):-
writeExp(Ul),
write('+'),
writeExp(U2).
writeExp(mult(U1,U2)):-
writeExp(U1),
write('*'),
writeExp(U2).
goal
writeExp(plus(mult(x,number(99)),mult(number(3),x))),nl.
На следующем шаге мы рассмотрим предикат writef.