Скачиваний:
201
Добавлен:
17.06.2016
Размер:
2.69 Mб
Скачать

Упражнения

1. Загрузите программу CH11EX02.PRO и проверьте следующие цели:

solve (1,2,1).

solve (1,1,4).

solve (1,-3,2).

Решениями должны быть:

X=-1

Нет решений

X1=2 и X2=1

соответственно.

2. Целью этого упражнения яелыется эксперимент с предикатом mysqrt в

программе CH11EX02.PRO. Для того, чтобы можно было следить за проме-

жуточными вычислениями, добавьте в качестве первой подцели в первое

предложение mysqrt:

write(Guess)

Чтобы посмотреть эффект этих исправлений, испытайте такую цель:

mysqrt(8,1,Result).

Затем, замените предложение для equal фактом:

equal (X,X).

и повторно проверьте цель. Поэкспериментируйте немного со свойствами

equal. Например, попробуйте:

equal (X,Y) :-

X/Y<1.1,X/Y>0.9.

Турбо Пролог имеет встоенную функцию квадратного корня sqrt.

X = sqrt(D),

которая присвоит X квадратный корень от значения D. Перепишите прог-

рамму CH11EX02.PRO с использованием sqrt и сравните полученные отве-

ты с ответами первоначальной версии.

Сравнение символов, строк и идентификаторов

Кроме числовых выражений вы можете также сравнивать простые символы,

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

'a' < 'b' /* Символы */

"antony" > "antonia" /* Строки */

P1 = peter, R2 = sally,P1>P2 /* Литералы*/

Символы

Используя соответствующее значение кода ASCII для каждого символа,

Турбо Пролог преобразует 'a' < 'b' в эквивалентное арифметическое выраже-

ние 97 < 98. Когда две строки или литерала сравниваются, результат зави-

сит от сравнения символов на соответствующих позициях. Результат будет

такой же, как при сравнении начальных символов, исключая случай, когда

они одинаковы. В этом случае Турбо Пролог сравнивает следующую пару соот-

ветствующих символов и возвращает результат, если эти символы не равны, в

противном случае сравнивается третья пара и так далее.

Строки

Сравнение "antony" > "antonia" оценится как "true" (истинное), так

как первая пара различных символов содержит в первой строке букву y (зна-

чение 79 в коде ASCII), а в другой строке букву i ( ASCII значение 69).

Отметим, что сравнение "aa">"a" истинно.

Аналогично, выражение "peter" > "sally" будет ложно, так как опреде-

ляется сравнением значений ASCII первых букв слов "peter" и "sally". Сим-

вол 'p' располагается перед символом 's' в алфавите, поэтому 'p' имеет

меньшее значение кода ASCII. Таким образом, выражение оценится как лож-

ное.

Идентификаторы

Идентификаторы не могут непосредственно сравниваться из-за их син-

таксиса. В случае P1= peter, P2 ... например, идентификатор peter не мо-

жет непосредственно сравниваться с идентификатором sally. Они должны быть

связаны с переменными, которые сравниваются, или записаны как строки.

ГЛАВА 12. ЗАПИСЬ, ЧТЕНИЕ И ФАЙЛЫ

В этой главе мы впервые рассмотрим базовые встроенные предикаты для

чтения и записи. Далее мы опишем, как в Турбо Прологе, работает файловая

система и покажем, как вы можете направлять ввод и вывод в файлы. Мы так-

же рассмотрим домен file и несколько предопределенных файлов. Мы закончим

эту главу примером, который показывает, как вы можете использовать преди-

каты, работающие с файлами, для разработки базы данных на дисковом файле.

Запись и чтение

В данном описании большая часть вывода направлялась на экран, а

большая часть ввода осуществлялась с клавиатуры. В данной главе мы расс-

мотрим стандартные предикаты ввода-вывода и познакомим вас с парой преди-

катов, которые позволят вам выполнять чтение из файлов.

Запись

В Турбо Пролог включены три стандартных предиката для вывода. Это

предикаты write, nl и writef.

Предикаты write/* и nl

Предикат write может быть вызван с произвольным числом аргументов:

write( Param1, Param2, ... ParamN) /* (i, i, ... i) */

Эти аргументы могут быть либо константами из стандартных доменов,

либо переменными. Если это переменные, то они должны быть входными пара-

метрами.

Стандартный предикат nl (от new line - новая строка) всегда исполь-

зуется вместе с write. Он обеспечивает переход на новую строку на экране

дисплея. Например, следующие подцели:

pupli(PUPIL,CL),

write(PUPIL,"is in the",CL,"class"),

nl,

write("----------------------------------").

могут привести к выводу на экран такого результата:

Helen Smich is in the fourth class

----------------------------------

а следующая цель:

write("List1 = ",L1,", List2 = ",L2 ).

может дать:

List1 = [cow,pig,rooster], List2 = [1,2,3]

Так же, если My_sentence связана с

sentence (subject(john),sentenceVerb(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),sentenceVerb(sleeps))

Часто предикат write не дает вам много из того, чего бы вам хотелось

иметь при печати таких сложных объектов, как списки, но нетрудно написать

программы, которые позволяли бы работать с такими объектами. Следующие

несколько примеров иллюстрируют эти возможности.

Соседние файлы в папке Документация