Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие Функциональное и логическое программирование.docx
Скачиваний:
5
Добавлен:
01.07.2025
Размер:
310 Кб
Скачать
☆

Отрицание как неудача запроса.

Информация о фактах, которые не являются истинными, или об отношениях, которые не соблюдаются, называется негативной. Негативная информация обычно не хранится в Пролог-программах в явной форме. Вместо этого считается, что вся информация, отсутствующая в текущем множестве фраз, является ложной. Система не различает отсутствующую в программе фразу и доказуемо неистинную фразу. По умолчанию Пролог-система всегда руководствуется правилом, которое называется предположением о замкнутости мира:

если фраза Р отсутствует в текущей программе, то это значит, что представлено отрицание Р.

При работе с неизвестной информацией часто руководствуются предположением об открытости мира:

если фраза Р отсутствует в текущей программе, то это значит, что Р ни истинна, ни ложна.

В этом случае различают три значения запроса – «истина», «ложь» и «неизвестно», - чтобы иметь возможность в случае отсутствия информации предпринять какие-то шаги, например, обратиться к альтернативному источнику информации. Чтобы поведение программы соответствовало предположению об открытости мира, это необходимо выражать явно при написании программы.

Отрицание в явной форме представляет собой встроенный предикат:

not (аргумент) ,

где аргумент – это запрос, значение которого после обработки заменяется на противоположное. Для определения этого предиката с помощью отсечения используются встроенные предикаты:

fail – цель, которая всегда ложна.

Этот встроенный предикат всегда приводит к неудаче. Когда он является частью составного запроса, то заставляет интерпретатор вернуться назад и попробовать найти новые конкретизации для переменных. Этот процесс будет продолжаться до тех пор, пока не исчерпаются соответствующие факты программы, после чего весь составной запрос потерпит неудачу:

true – цель, которая всегда истинна.

not (P):- P, ! , fail.

not (P):- true.

Пример 1. Определим сельского жителя как человека, не являющегося ни горожанином, ни жителем пригорода:

горожанин (иван).

житель_пригорода (софья).

сельский_житель (Х):- not ( горожанин ( Х ) ), not ( житель_пригорода ( Х ) ).

    1. Встроенные предикаты.

Встроенные предикаты, предназначенные для ввода-вывода:

readln(Аргумент) - считывает данные, введенные пользователем, в виде строки и размещает их в Аргумент;

readint(Аргумент), readreal(Аргумент), readchar(Аргумент) - считывает соответственно целое, вещественное число, символ;

readterm(Тип_Аргумента, Аргумент) - считывает терм;

write([Арг1, … , Аргn]) - число аргументов любое, аргументы - термы (константы или переменные);

nl - переход на новую строку:

writef(Строка_форматов, Арг1, … , Аргn) - форматированный вывод;

в строке форматов могут присутствовать:

%d - целое число или символ;

%s - строка или атом;

%f - вещественное число;

\n - переход на новую строку;

\t - табуляция.

Передавать программы Пролог-системе можно при помощи двух встроенных предикатов.

consult («имя файла») - добавляет новые предложения в программу из файла. В результате все предложения программы, содержащейся в файле, будут использоваться системой при ответе на дальнейшие вопросы пользователя. Если позже в том же сеансе произойдет "консультация" с другим файлом, предложения нового файла будут добавлены в конец текущего множества предложений.

reconsult («имя файла») – действует так же, как и предыдущий предикат, но при этом переопределяет ранее введенные определения отношений, не затрагивая тех отношений, о которых в файле ничего не сказано.

Работа со строками:

frontchar(Строка, ПервыйСимвол, Остаток) - берет первый символ строки и возвращает оставшуюся часть строки;

frontstr(N, Строка, Начало, Конец), N - целое число, Строка - строка длиной не менее N символов; предикат возвращает первые N символов Строки через переменную Начало, а остальные символы через переменную Конец;

fronttoken(Строка, Признак, Остаток) - находит первое слово или число в Строке, возвращает его через переменную Признак, а остаток - через переменную Остаток;

str_len(Строка, Длина) - определяет число символов в Строке.

Преобразование типов:

str_char(Cтрока, Символ), str_int(Cтрока, Целое), str_real(Cтрока, Действительное) - преобразование значений от одного типа к другому;

char_int(Символ, КодСимвола) - получить код символа (или преобразовать код в символ);

upper_lower(ВерхнийРегистр, НижнийРегистр) - строка целиком переводится либо в заглавные, либо в строчные буквы;