Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
пособие_Пролог_часть1.doc
Скачиваний:
40
Добавлен:
13.11.2019
Размер:
1.36 Mб
Скачать

6.3. Предикаты определения типов термов.

Программист может предотвратить ошибки Пролога, проверив тип аргумента предиката с помощью следующих встроенных в Пролог-систему предикатов:

  1. integer(X) истинно, если X—целое число;

  2. float(X) истинно, если X—вещественное число;

  3. number(X) истинно, если X— целое или вещественное число;

  4. atom(X) истинно, если X—атом;

  5. atomic(X) истинно, если X—атом или число;

  6. compound(X) истинно, если X—составной атом (структура);

  7. novar(X) истинно, если X—константа;

  8. var(X) истинно, если X—переменная.

  9. string(X) истинно, если X—строка.

6.4. Примеры программ с использованием арифметических предикатов.

Пример 1.

Программа определяет, попадает ли точка с координатами (X,Y) в область D, которая задана графически (рис. 6.1).

Программа 1.

in_area(X,Y):- number(X), number(Y),(X^2+Y^2)=<4.

out_area(X,Y):- number(X), number(Y),(X^2+Y^2)>4.

otvet(X,Y):-in_area(X,Y),write(‘заданная точка принадлежит области D’).

otvet(X,Y):-out_area(X,Y),write(‘заданная точка не принадлежит области D’).

Пример запроса к программе 1.

? — otvet(0.3,-0.1).

заданная точка принадлежит области D

YES

Пример 2.

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

Программа 2.

variant1(A,B):- number(A), number(B),A>0,B<0.

variant2(A,B):- number(A), number(B),A>0,B>=0.

variant3(A,B):- number(A), number(B),A=<0.

calc_Y(A,B):- variant1(A,B),Y is A*B^2,write(‘Y= ‘),write(Y).

calc_Y(A,B):- variant2(A,B),Y is A^3,write(‘Y= ‘),write(Y).

calc_Y(A,B):- variant3(A,B),Y is 0,write(‘Y= ‘),write(Y).

Пример запроса к программе 2.

? — calc_Y(0.3,-0.1).

Y=0.003

YES

6.5. Предикаты вводавывода термов и символов.

Предопределенные предикаты стандартного ввода/вывода являются внелогическими, так как выходят за рамки модели логического программирования. Такие предикаты в процессе вычисления запросов порождают побочный эффект. Любой язык программирования должен обеспечивать средства ввода/вывода информации. Однако вычислительная модель Пролога препятствует введению операций ввода/вывода в виде чистых компонентов языка.

В системах программирования на языке Пролог используются предопределенные предикаты для ввода/вывода термов и символов.

6.5.1. Ввод/вывод термов.

Для ввода термов со стандартного устройства ввода ПЭВМ (клавиатуры) используется предикат read(<терм>). Предикат read читает терм, набираемый пользователем на клавиатуре; после вводимого терма должна обязательно следовать точка. Если переменная не конкретизирована, то запрос:

?read(X).

приведет к вводу терма с клавиатуры, и этот терм будет присвоен в качестве значения переменной X.

Для вывода термов на стандартное устройство вывода ПЭВМ (экран видеомонитора) используется предикат write(<терм>). Предикат write выводит терм на экран. В качестве термов могут выдавать на экран константы, значения конкретизированных переменных и составные термы. Если переменная не конкретизирована, то вместо ее значения будет выдано соответствующее переменной ссылочное число.

Предикат nl используется для перехода на новую строку при выдаче данных на экран. Предикат tab(N) используется для выдачи на экран N пробелов. Предикаты nl и tab применяются только совместно с предикатов write.

Примеры программ, использующих предикаты ввода/вывода.

Пример 1. Программа ввода элементов списка заданной длины.

vvlist :  write(‘задайте длину списка’), read(N), vvodlist(N,L),

write(‘L= ’), write(L).

vvodlist(0,[]).

vvodlist(N,L) : N>0,write(‘введите элемент списка: ‘), read(X),

N1 is N-1, vvodlist(N1,L1), append(L1,[X],L).

append([],L,L).

append([H|L],M,[H|R]):  append(L,M,R).

В ответ на запрос

?  vvlist.

система выдаст на экран следующие сообщения:

задайте длину списка

3.

введите элемент списка: a.

введите элемент списка: b.

введите элемент списка: c.

L=[a,b,c]

Пример 2. Программа pech_list выдает на экран длину списка.

pech_list(L) :  length(L,N), write(‘Длина списка ‘),

write(L), write(‘=’) , write(N) , write(‘.’).

В ответ на запрос

?  pech_list([a,b,c,d]).

система выдаст на экран строку:

Длина списка [a,b,c,d]=4.

Для выдачи на экран списка можно использовать стандартный предикат write(<список>) или написанную пользователем рекурсивную процедуру выдачи на экран элементов списка.

Предикат writelist (X) выдает на экран элементы списка X. Схема отношения этого предиката имеет вид:

writelist(<список>).

Процедура writelist(X) состоит из двух правил:

writelist(X): length(X,N), N=:=0,!, write(‘Список пуст’).

writelist(X): wrl(X).

wrl([]):nl,write(‘Конец списка’).

wrl([H|T]): write(H),write(‘ ‘),wrl(T).