Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Арифметические действия в языке Пролог



 

Тема: Арифметические действия в языке Пролог.

Основные термины, ключевые слова: операторы языка Пролог для выполнения арифметических действий.

Инструмент для выполнения работы: интегрированная среда языка Пролог – Strawberry Prolog v.2.3 (SP), интегрированная среда Visual Prolog v.5.2 (VP).

Содержание отчета:

- титульный лист установленного образца;

- краткие теоретические сведения;

- описание индивидуального задания;

- текст программы на языке Пролог;

- выводы по работе.

Основные теоретические сведения. Язык Пролог относится к декларативным языкам, которые предназначены для обработки символьной информации. В редких случаях в языке используются средства для выполнения арифметических действий. Эти средства для различных версий сильно отличаются. Наиболее развитым математическим аппаратом снабжены более поздние версии языка, например, VP, который предназначен для решения широкого круга задач, а не только символьной обработки данных. В SP подобные средства более «скромные», однако, их вполне достаточно для решения большинства математических задач.

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

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

Пример 1. Сложение двух чисел.

Если Пролог-системе задать следующий вопрос:

? -12+34, то ответом системы будет

Compiling the file:

C: \VIP\VPI\EXAMPLES\and_\and_

0 errors, 0 warnings.

 

No.

Здесь не указано никаких действий, и Пролог-система выдает подобный ответ. Для того, чтобы система выполнила действие, поставим вопрос иначе:

? -X is 12+34, write(X), nl.

В этом случае ответ будет следующим:

Compiling the file:

C: \VIP\VPI\EXAMPLES\and_\and_

0 errors, 0 warnings.

 

Yes.

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

Пример 2. Использование скобочных выражений.

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

? -X is (12+34)*20//4, write(X), nl.

Ответом в данном случае будет число 230.

Пример 3. Использование переменных в арифметических выражениях.

Как уже отмечалось, перед использованием переменных в выражениях, они должны быть конкретизированы числовыми значениями. Это показано ниже.

? -X=23, Y=11, Z is X*Y, write(Z), nl.

Рассмотрим последний вопрос к системе более подробно. Отметим ту особенность, что символ равенства (=) здесь не обозначает операцию присваивания, как в алгоритмических языках программирования. Это операция сопоставления объектов и в случае, если она завершается успехом, переменные конкретизируются соответствующими значениями, в данном случае числовыми. Оттранслируйте этот фрагмент и посмотрите результат.

В языке Strawberry Prolog кроме рассмотренных арифметических действий определены следующие операции над числовыми величинами:

+ сложение

- вычитание

* умножение

/ вещественное деление

** степень числа (экспонента)

// целочисленное деление

mod деление по модулю

rem остаток от целочисленного деления

abs абсолютное значение числа

sign знак числа

random случайное число, не превышающее значения аргумента.

Следует отметить, что в среде Strawberry Prolog можно оперировать как с целочисленными значениями, так и с вещественными. Причем вещественные числа можно представлять как в обычном формате, так и в экспоненциальном. Следующий фрагмент программы демонстрирует сказанное.

? - X=2300.345, Y=4.4e2, Z is X/Y, write(Z), nl.

Оттранслируйте фрагмент и получите результат.

Для вещественных чисел в Strawberry Prolog определены следующие функции: sin, cos, tg, arcsin, arccos, arctg, sinh, cosh, tgh, sqrt, log, log10, exp. Их названия и функциональные действия совпадают с известными функциями алгоритмических языков программирования. Следует помнить, что тригонометрические функции в качестве аргументов получают значения, измеряемые в радианах. Если есть потребность работы с аргументами, измеряемыми в градусах, необходимо сделать соответствующие преобразования, например:

? - X is sin(3.14*30/180), write(X), nl.

При работе с числовой информацией очень часто используются операции сравнения. В Прологе и, в частности, в Strawberry Prolog имеется ряд операторов, позволяющих производить операции сравнения чисел:

X > Y X больше Y

X < Y X меньше Y

X > = Y X больше или равен Y

X =< Y X меньше или равен Y

X =: =Y величины X и Y совпадают (равны)

X =\= Y величины X и Y не равны

Следует отметить разницу между операторами = и =: =, первая вызовет сопоставление объектов и если они сопоставимы, приведет к конкретизации. Никаких вычислений при этом производиться не будет. Вместе с тем, вторая операция (=: =) вызовет арифметические действия, а конкретизации переменных производиться, не будет.

 

Индивидуальные задания. Согласно Вашему вариантувыполнить индивидуальное задание.

 

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

2. Определить предикат, вычисляющий площадь равнобедренного треугольника.

3. Определить предикат, вычисляющий площадь произвольного треугольника.

4. Определить предикат для вычисления площади прямоугольника.

5. Определить предикат для вычисления площади ромба.

6. Определить предикат для вычисления площади трапеции.

7. Определить предикат для вычисления площади прямоугольной трапеции.

8. Определить предикат для вычисления площади окружности.

9. Определить предикат, вычисляющий площадь плоской n-угольной геометрической фигуры.

10. Определить предикат, вычисляющий площадь шестиугольника.

11. Определить предикат для вычисления объема параллелепипеда.

12. Определить предикат для вычисления площади параллелограмма.

13. Определить предикат для вычисления объема куба.

14. Определить предикат, вычисляющий объем шара.

15. Определить предикат, вычисляющий объем треугольной пирамиды.

16. Определить предикат, вычисляющий объем четырехугольной пирамиды.

17. Определить предикат, вычисляющий объем конуса.

18. Определить предикат, вычисляющий площадь окружности, вписанной в треугольник.

19. Определить предикат для вычисления площади окружности описывающей треугольник.

20. Определить предикат для вычисления площади квадрата, вписанного в окружность.

21. Определить площадь квадрата, описывающего окружность.

 

Контрольные вопросы

1. Особенности арифметических операций в языке Пролог.

2. Основные арифметические операции над числовыми величинами.

3. Использование математических функций в Прологе.

4. Операции сравнения числовых величин, их использование в программах

5. Декларативный смысл и процедурная семантика пролог-программы при использовании арифметических операций и операций сравнения.

 

Лабораторная работа 4

Рекурсия

Тема : основы рекурсивного программирования в языке Пролог.

Основные термины, ключевые слова: рекурсия, простые рекурсивные структуры Пролога, минимально рекурсивная программа.

Инструмент для выполнения работы: интегрированная среда языка Пролог – Strawberry Prolog v.2.3 (SP), интегрированная среда Visual Prolog v.5.2 (VP).

Содержание отчета:

- титульный лист установленного образца;

- краткие теоретические сведения;

- задание на работу;

- текст программы на языке Пролог;

- выводы по работе.

Основные теоретические сведения. Любое определение, которое описывается в терминах самого себя, называется рекурсивным. Рекурсия – один из приемов, который встречается практически во всех видах программирования. В декларативных языках рекурсия играет доминирующую роль. С одной стороны это связано с рекурсивной внутренней структурой декларативных языков. С другой – в нечисловом программировании часто используются структуры, рекурсивные по своей природе, например, списки, деревья, графы.

В математике рекурсивным началом можно считать натуральное число, если положить, что отправной точкой для любого натурального числа считать цифру 0. Любое натуральное число можно определить как функцию следования S от числа 0, т. е. 0, S(0), S(S(0)), …, S(S(S(…S(0)…))). Благодаря функции следования любое натуральное число представляется как рекурсивная структура с граничным условием, равным нулю. В языке Пролог напрямую запрограммировать функцию следования не представляется возможным, однако, используя математические операции можно ее промоделировать с определенной степенью верности.

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

natural_number(0).

natural_number(X): - Y is X - 1, Y> =0, natural_number(Y), write(X), nl.

? -natural_number(5).

После трансляции этого фрагмента, Пролог-система выдаст следующий ответ:

Compiling the file:

D: \StrawberryProlog\Strawberry Prolog\Examples\test_2

0 errors, 0 warnings.

Yes.

Здесь получена последовательность всех натуральных чисел меньше заданного в вопросе.

Рассмотрим программу более детально. В первом предложении описано условие выхода из рекурсии или граничное условие. Граничное условие (можно сказать – самый простой из всех возможных случаев) в программе должно быть описано раньше, чем рекурсивное определение. Негласный закон рекурсивного программирования можно сформулировать следующим образом: «В начале проверь самое простое, а затем переходи к более сложному». Второе предложение – собственно сама рекурсия, поскольку в определении предиката в правой части осуществляется попытка доказательства цели с тем же именем, что и имя предиката. Кроме того, во втором предложении последовательность целей: Y is X - 1, Y> =0 представляют собой «модель» функции следования S.

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

Следует отметить тот факт, что в рекурсивном определении, рекурсия присутствует только один раз. Программы такого вида называют минимально рекурсивными. Кроме того, рекурсивная цель в правиле присутствует в конце предложения (операция вывода на экран не в счет), это хвостовая рекурсия.

Над натуральными числами в математике определено конечное множество операций, например, сложение, умножение, возведение в степень, etc. Можно показать, что все это множество подчиняется той же функции следования S. Однако числовые величины не являются предметом изучения декларативных языков программирования. Наиболее подходящей рекурсивной структурой являются списки. Список представляется либо пустым списком – [], либо, если он не пустой, структурой, состоящей из головы(head) и хвоста(tail). Причем в качестве головы может выступать любой объект Пролога, а в качестве хвоста – обязательно список. Подобное определение обязывает список быть рекурсивной структурой, поскольку его хвост сам по себе является списком.

В терминах Пролога список определяется достаточно просто:

list([]).

list([H|T]): - list(T).

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

Правильность программы можно протестировать, задав соответствующий вопрос, например:

? -X=[a, s, d, f], list(X), write(X), nl.

 

Compiling the file:

D: \StrawberryProlog\Strawberry Prolog\Examples\test_2

0 errors, 0 warnings.

[a, s, d, f]

Yes.

Если же поставить следующий вопрос:

? -X='a', list(X), write(X), nl.,

то этом случае Пролог ответит не утвердительно.

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

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

binary_tree(_, _, _).

binary_tree(Element, Left, Rigth): -binary_tree(Left), binary_tree(Rigth).

В отличие от списка для двоичного дерева характерна двойная рекурсия, то есть рекурсия по левому и правому поддеревьям. Это хорошо видно из второго предложения. Следует отметить, что эта программа уже не минимально рекурсивная.

Поставьте перед Пролог-системой вопрос

? - binary_tree(a, binary_tree(b, void, void), binary_tree(c, void, void)).

и проанализируйте ответ.

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

tree_member(X, binary_tree(_, _, _)).

tree_member(X, binary_tree(_, Left, _)): -tree_member(X, Left).

tree_member(X, binary_tree(_, _, Rigth)): -tree_member(X, Rigth).

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

Декларативный смысл отношения достаточно очевиден: элемент принадлежит двоичному дереву, если он является корнем дерева. Если элемент не корень, то он принадлежит или левому или правому поддереву.

Имея подобный предикат, пользователь может проверить объект на «тип» дерева, например, задав вопрос:

? -tree_member(b, binary_tree(a, binary_tree(b, void, void), binary_tree(c, void, void))).

 

Ответ Пролог-системы:

Compiling the file:

D: \StrawberryProlog\Strawberry Prolog\Examples\test_2

0 errors, 0 warnings.

Yes.

 

Индивидуальные задания. Выполнить индивидуальное задание согласно Вашим вариантам, представленным ниже.

1. В списке S1, S2, S3, …, SN найти первое и последнее вхождение заданного символа и исключить все символы между ними.

2. В списке символов S1, S2, S3, …, SN исключить все последовательности указанного вида, например, [a, b, c, d]

3. В списке символов S1, S2, S3, …, SN найти длину наибольшей последовательности, построенной повторением одного и того же символа. Вывести эту последовательность

4. В списке символов S1, S2, S3, …, Sn каждую последовательность символов заменить другой последовательностью

5. Из списка символов исключить все символы между круглыми скобками

6. Даны два списка целых чисел A1, A2, A3…AN и B1, B2, B3, …, B. Соединить эти списки в один, исключив все повторения и упорядочить список по возрастанию

7. В списке символов подсчитать количество букв в последнем слове, если разделителем между словами является пробел (число пробелов может быть больше одного)

8. В списке символов подсчитать число слов, если разделителем между словами является пробел

9. Вдоль доски расположены лунки и в каждой лунке лежит шар белого или черного цвета. Одним ходом разрешается менять два соседних шара. Добиться того, чтобы в лунках сначала лежали белые, а затем черные шары

10. В списке символов найти число слов, начинающихся с заданной буквы. Разделителем между словами является один или несколько пробелов.

11. В списке символов найти длину самого короткого слова. Разделитель между словами один или несколько пробелов.

12. В списке символов найти все вхождения данного слова. Разделитель между словами один или несколько пробелов. Вывести это слово.

13. Вдоль доски расположены лунки в которых лежат шары белого, красного и синего цвета. Одним ходом разрешается менять местами два соседних шара. Добиться того, чтобы в лунках сначала лежали белые, затем красные, а потом синие шары.

14. В списке символов найти число слов с одинаковой первой и последней буквами. Разделяются слова одним или более пробелами. Вывести самое длинное слово

15. В списке символов найти среднюю длину слова. Вывести все слова, имеющие эту длину.

16. Из списка целых чисел A1, A2, A3…AN исключить все элементы, совпадающие со значением [(A_max+A_min+A_cp)/3]

17. Преобразовать список целых чисел A1, A2, A3, …, AN следующим образом: исключить все нули, слева записать все положительные числа

18. Список целых чисел A1, A2, A3, …, AN оставить без изменений, если он упорядочен по возрастанию или убыванию. В противном случае: каждый нечетный элемент списка утроить, каждый четный элемент, кратный четырем, удалить

19. В каждой из девяти клеток квадрата 3*3 разместить одно из чисел 1. 2 и 3 так, чтобы сумма чисел, стоящих в каждом вертикальном ряду, в каждом горизонтальном ряду и на каждой диагонали равнялась

20. Для N произвольных заданных костяшек домино необходимо найти все возможные цепочки из этих костяшек длиной N. Если таких цепочек нет, то выдать максимально длинную возможную цепочку

21. Решить упрощенный вариант головоломки «пятнашки» для поля 3*3

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

23. Для двух произвольных строк символов определить, является ли одна из них инвертированной копией другой без учета пробелов

24. Написать программу отыскания кратчайшего пути коня из позиции a1 на стандартной шахматной доске в произвольную позицию

 

Примечание. Если задание покажется слишком легким, обратитесь за более «интересным» к преподавателю.

 

Контрольные вопросы

 

1. Понятие рекурсии.

2. Особенности рекурсии в Прологе.

3. Рекурсивные структуры в декларативном программировании.

4. Порядок предложений и целей в предложениях при рекурсии.

5. Декларативный смысл рекурсивных программ, «процедурные» особенности рекурсии.

6. Минимально рекурсивное отношение.

7. Хвостовая рекурсия.

 

Лабораторная работа 5

Решение логических задач

Тема : основы программирования логических задач, головоломок.

Основные термины, ключевые слова: логическая игра, головоломка, схема решения.

Инструмент для выполнения работы: интегрированная среда языка Пролог – Strawberry Prolog v.2.3 (SP), интегрированная среда Visual Prolog v.5.2 (VP).

Содержание отчета:

- титульный лист установленного образца;

- краткие теоретические сведения;

- задание на работу;

- текст программы на языке Пролог;

- выводы по работе.

Основные теоретические сведения. Одно из основных применений языка Пролог – решение задач логики, головоломок, игровых задач. Внутренняя структура языка, механизм возврата как нельзя лучше подходят для решения подобного рода задач. Обычно головоломка состоит из нескольких фактов относительно небольшого числа объектов, которые имеют различные атрибуты. Минимальное число фактов относительно объектов и атрибутов связано с желанием выдать единственный вариант назначения атрибутов объектам. Один из подходов решения логических задач рассмотрим на следующем примере.

Три друга заняли первое, второе и третье места в соревнованиях универсиады. Друзья – разной национальности, зовут их по-разному, и любят они разные виды спорта.

Майкл предпочитает баскетбол и играет лучше, чем американец. Израильтянин Саймон играет лучше теннисиста. Игрок в крокет занял первое место.

Кто является австралийцем? Каким спортом занимается Ричард?

Подобные логические головоломки изящно решаются посредством конкретизации значений подходящей структуры данных и выделения значения, приводящего к решению. Каждый ключ к решению преобразуется в факт относительно структуры данных. Это может быть сделано с использованием абстракции данных до определения точной формы структуры данных. Проанализируем первый ключ к разгадке: «Майкл предпочитает баскетбол и играет лучше, чем американец». Очевидно, речь идет о двух разных людях. Одного зовут Майкл, и занимается он баскетболом, в то время как второй – американец. Кроме того, Майкл лучше играет в баскетбол, чем американец. Предположим, что Друзья – структура данных, подлежащая конкретизации, тогда искомый ключ может быть выражен следующей конъюнкцией целей:

играет_лучше(Мужчина_1, Мужчина_2, Друзья),

имя(Мужчина_1, Майкл), спорт(Мужчина_1, баскетбол),

национальность(Мужчина_2, американец).

Аналогично второй ключ можно представить конъюнкцией целей:

играет_лучше(Мужчина_1, Мужчина_2, Друзья),

имя((Мужчина_1, Саймон),

национальность(Мужчина_1, израильтянин),

спорт(Мужчина_2, теннис).

Наконец, третий ключ к разгадке выразится следующим образом:

первый(Друзья, Мужчина), спорт(Мужчина, крокет).

Базовый предикат для решения головоломок:

решить_головоломку(Головоломка, Решение)., где Решение является решением головоломки Головоломка. Головоломка представляется структурой головоломка(Ключи, Вопросы, Решение). Общую схему решения головоломки можно представить следующим образом:

решить_головоломку(головоломка(Ключи, Вопросы, Решение), Решение): - решить(Ключи), решить(Вопросы).

решить([]).

решить([Ключ|Ключи]): -решить(Ключ).

Каждый человек имеет три атрибута и представляется структурой вида: друг(Имя, Страна, Спорт)., а в качестве структуры данных последовательность трех элементов, представляющим список: [друг(N1, C1, S1), друг(N2, C2, S2), друг(N3, C3, S3)]. Ключи и вопросы в данном примере предлагается составить самостоятельно. Для проверки: Майкл – австралиец, а Ричард играет в теннис.

Эта схема решения дает представление об общем подходе для решения головоломок. Часто подобную схему называют решателем головоломок. Следует отметить, что «универсального» решателя нет, для каждого конкретного случая необходим свой подход к решению, несмотря на то, что можно выделить наиболее общие моменты, присущие большинству логических задач.

Следующий пример заимствован у Раймонда Смаллиана из серии «Принцесса и тигр» и доведен до «конечного» результата.

«…У Фрэнка Стоктона есть сказка, которая называется " Принцесса или тигр? " В этой сказке один узник должен угадать, в какой из двух комнат находится принцесса, а в какой - тигр. Если он укажет на первую комнату, то женится на принцессе, если на вторую, то его, вполне возможно, растерзает тигр.

В некотором царстве правил король. Однажды он тоже прочитал эту сказку. “В самый раз для моих заключенных! ” - сказал он своему министру. Только я не хочу полагаться на случайности. Пусть на дверях каждой комнаты повесят по табличке, а заключенному будет кое-что сказано о них. Если узник не глупый и способен рассуждать логически, он сумеет сохранить себе жизнь и в придачу заполучить прелестную невесту. “Блестящая идея, ваше величество! ” - согласился министр…».

Испытания первого дня.

В самый первый день были проведены три испытания. При этом король объявил узнику, что в ходе всех трех испытаний в каждой из комнат будет находиться либо принцесса, либо тигр, хотя вполне может статься, что сразу в обеих комнатах обнаружится по тигру или там окажутся одни лишь принцессы.

Первое испытание. «А что, если в обеих комнатах сидят тигры? » - спросил узник. «Что же мне тогда-то делать? » «Считай, не повезло», - ответил король. «А если в обеих комнатах окажется по красавице? » - поинтересовался узник. «Считай, подфартило», - сказал король. «Уж это ты и сам бы мог сообразить! »- «Ну, хорошо, а если в одной комнате принцесса, а в другую посадили тигра, что тогда? » - не успокаивался узник. «Вот тут-то уже все зависит от тебя! Не так ли? » «Да откуда же мне знать, где кто? » - сокрушенно вздохнул узник. Тут король указал на таблички, прикрепленные к дверям каждой из комнат. На них было написано:

 

В этой комнате находится принцесса, а в другой комнате сидит тигр В одной из этих комнат находится принцесса, кроме того, в одной комнате сидит тигр

 

«А это правда, что здесь написано? » - спросил узник. «На одной – правда», - отвечал король, «на другой – нет». А вы как бы ответили на месте узника? (Конечно, если вы предпочитает принцессу тигру.)

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

maybe(tiger, tiger).

maybe(princess, princess).

maybe(princess, tiger).

maybe(tiger, princess).

Двухаргументное отношение maybe задает «расположение» объектов задачи (принцесса – тигр), причем первый аргумент относится к левой комнате, а второй – к правой.

Надпись на табличке первой (левой) двери гласит о том, что «в этой комнате находится принцесса, а в другой комнате сидит тигр». Эту надпись легко описать с помощью следующего отношения room_1(X, Y): -X=princess, Y=tiger. По аналогии для второй двери, надпись на которой можно понимать так, что в любой из этих комнат находится принцесса, а в другой – тигр. Это кодируется следующим отношением room_2(X, Y): -X=princess, Y=tiger; X=tiger, Y=princess.

Конъюнкция этих отношений послужит для определения отношения типа «кто_где» - who_where(X, Y): -maybe(X, Y), room_1(X, Y), room_2(X, Y)., которое позволит найти решение задачи.

А теперь объединим все отношения в единую процедуру, оттранслируем и зададим вопрос.

 

maybe(tiger, tiger).

maybe(princess, princess).

maybe(princess, tiger).

maybe(tiger, princess).

 

room_1(X, Y): -X=princess, Y=tiger.

room_2(X, Y): -X=princess, Y=tiger;

X=tiger, Y=princess.

 

who_where(X, Y): -maybe(X, Y),

room_1(X, Y),

room_2(X, Y).

 

? -who_where(X, Y), write(" В первой комнате - " ), write(X), nl,

write(" Во второй комнате - " ), write(Y).

Compiling the file:

C: \Program Files\Strawberry Prolog\Examples\isp_1

0 errors, 0 warnings.

 

В первой комнате - princess

Во второй комнате - tiger

Yes.

Проверьте этот ответ Пролог системы. Совпадает он с вашими выводами

 

Индивидуальные задания. Выполнить индивидуальное задание согласно Вашему порядковому номеру в группе и плюс задание с номером большим на 10, например, первый вариант выполняет задание с номерами 1 и 11, второй вариант соответственно с номерами 2 и 12 и т. д.

 

Вариант 1

- Испекла бы ты вкусных крендельков! - как-то раз в холодный летний денек попросил Король Червей Королеву Червей.

- Что толку печь крендели, когда нет варенья?! - яростно возопила Королева. - Ведь самое вкусное в кренделях - это варенье! - Так возьми варенье, - посоветовал Король.- Хотела бы, да не могу, - совсем рассердилась Королева. - Мое варенье кто-то украл! - Не может быть! - изумился Король. - Ты это серьезно? И кто же, по-твоему, украл варенье? Уж не думаешь ли ты, что я украла его? Да если бы я знала, кто похитил варенье, то варенье давным-давно было бы там, где положено, как, впрочем, и голова негодяя. Король приказал своим солдатам сыскать пропавшее варенье, и оно было найдено в домике, где обитали Мартовский Заяц, Болванщик и Соня. Разумеется, все трое были схвачены и предстали перед судом. Я требую, - заявил Король, обращаясь к судье и присяжным, - чтобы вы до конца разобрались в этом деле. Терпеть не могу, когда суют нос ко мне на кухню и воруют мое варенье. Почему? - спросила одна из морских свинок. Подавить эту морскую свинку, - вскричала Королева. Несчастную морскую свинку тотчас же подавили. (Те, кто читал " Приключения Алисы в Стране Чудес", без труда вспомнят, что означает слово " подавить": служители суда взяли большой мешок, сунули в него морскую свинку и, завязав мешок веревочкой, уселись на него.)- Итак, - продолжал Король, когда суматоха, вызванная подавлением морской свинки, улеглась, - я требую, чтобы вы до конца разобрались в этом деле! Вы уже говорили об этом, - заметила вторая морская свинка и тотчас же была беспощадно подавлена. Не вы ли случайно украли варенье? - спросил Король у Мартовского Зайца. Не крал я никакого варенья! - взмолился Мартовский Заяц. (Тут все оставшиеся морские свинки зааплодировали, и, разумеется, были подавлены.).-Ну а что скажете вы? - прорычал Король, обращаясь к Болванщику, который дрожал, как осиновый лист. - Вы случайно не злоумышленник, который украл варенье? Болванщик не мог вымолвить ни слова: он только глоток за глотком отпивал свой чай. Раз ему нечего сказать, то это доказывает его виновность, - заметила Королева. - Отрубить ему голову! Нет, нет! - едва выговорил дрожащим голосом Болванщик. - Варенье украл один из нас, но не я! -Запишите! - приказал Король присяжным. - Это показание может оказаться очень важным! Ну а вы? - продолжал Король, обращаясь к Соне. - Что вы скажете нам обо всем этом? Говорят ли оба ваших соседа., Мартовский Заяц и Болванщик, правду? -По крайней мере один из них сказал правду, - ответила Соня и мгновенно заснула, да так и проспала до конца судебного заседания. Как показало расследование, ни Мартовский Заяц, ни Болванщик не сказали правды одновременно. Кто украл варенье?

 

Вариант 2

- Теперь у нас снова есть варенье, - обратился Король к Королеве, - и ты сможешь наконец испечь кренделей.
- Как я могу печь крендели, когда у меня нет муки? - спросила Королева.
- Уж не хочешь ли ты сказать, что муку тоже украли?! - вскричал Король.- Вот именно! - сказала Королева. - Найди того, кто это сделал, и отруби ему голову! -Ну-ну! - пробормотал Король. - К чему такая спешка? Стали искать муку, и после некоторых поисков обнаружили ее в домике, где жили Мартовский Заяц, Болванщик и Соня. Разумеется, все трое были арестованы и предстали перед судом. На суде Мартовский Заяц заявил, что муку украл Болванщик. В свою очередь Болванщик и Соня дали показания, которые по каким-то причинам не были записаны, поэтому сообщить вам, о чем они говорили, я просто не в силах. В ходе судебного заседания выяснилось, что муку украл лишь один из трех подсудимых и что только он дал правдивые показания. Кто украл муку?

 

Вариант 3

Таким образом, первый узник спас себе жизнь и на радостях отбыл вместе с принцессой (см. пример выше). Таблички на дверях сменили, соответственно были подобраны и обитатели комнат. На этот раз на табличках можно было прочитать следующее:

 

I По крайней мере в одной из этих комнат находится принцесса II Тигр сидит в другой комнате

- Истинны ли утверждения на табличках? - спросил второй узник. Может, оба истинны, а может, оба ложны, - ответил ему король. Какую из комнат следует выбрать второму узнику?

Вариант 4

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

 

I Либо в этой комнате сидит тигр, либо принцесса находится в другой комнате II Принцесса в другой комнате

Кто же обнаружится в первой комнате - принцесса или тигр? А во второй?

Вариант 5

Вчера мы сваляли дурака, - сказал король своему министру. - Все трое выкрутились! Ладно, сегодня у нас еще пятеро, и я придумаю для них кое-что похлеще.- Блестящая идея, ваше величество! - поддержал министр. И во всех испытаниях этого дня относительно левой комнаты (комната I) король говорил вот что: - Если в этой комнате находится принцесса, то утверждение на табличке истинно, если же тигр, то ложно. В правой же комнате (комната II) все было наоборот: утверждение на табличке ложно, если в комнате находится принцесса, и истинно, если в комнате сидит тигр. Ну и опять же, вполне может статься, что в обеих комнатах находятся принцессы или в них сидит по тигру, либо, наконец, в одной комнате пребывает принцесса, а в другой - тигр.

Объявив эти правила следующему узнику, король указал на две новые таблички:

 

I В обеих комнатах находятся принцессы II В обеих комнатах находятся принцессы.

Какую из комнат следует выбрать на этот раз узнику

Вариант 6

Условия те же, а таблички следующие:

 

I По крайней мере в одной из комнат находится принцесса II Принцесса - в другой комнате

Вариант 7

Этой задачкой король особенно гордился, равно как и следующей за ней.

I Что ни выберешь - все едино II Принцесса - в другой комнате

Как должен поступить узник?

Вариант 8

Теперь на табличках было написано:

 

I Что выбрать - большая разница II Лучше выбрать другую комнату

Вариант 9

На дверях же нет никаких табличек! - воскликнул следующий узник Совершенно верно, - заметил король. - Их только что изготовили и не успели повесить. Так как же мне выбирать? - спросил узник. А вот эти таблички, - ответил король.

 

В этой комнате сидит тигр
В обеих комнатах сидят тигры

Очень мило, - обеспокоился узник, а какую табличку куда? Король призадумался. А тебе это знать вовсе не обязательно, - сказал король, наконец. - Задача решается и так. Только не забудь, конечно, - добавил он, - что если принцесса в левой комнате, то утверждение на табличке у этой двери будет истинным, а если там тигр, то ложным. Для правой же комнаты - все наоборот. Каково решение задачи в этом случае?

Вариант 10

Итак, на третий день король сделал все так, как задумал. Узнику были предложены на выбор три комнаты, в одной из которых, как объяснил король, находилась принцесса, а в двух других сидели тигры. На дверях комнат были повешены следующие таблички:

 

I В этой комнате сидит тигр II В этой комнате находится принцесса III Тигр сидит в комнате II

При этом король Добавил, что не более одного из этих утверждений является истинным. Где принцесса?

Вариант 11

И снова в комнаты поместили лишь одну принцессу и двух тигров. Король объяснил узнику, что на этот раз табличка на двери, за которой находится принцесса, говорит правду, а из двух других надписей, по меньшей мере, одна является ошибочной. Сами же таблички имели такой вид:

 

I Тигр сидит в комнате II II Тигр сидит в этой комнате III Тигр сидит в комнате I

Что делать узнику?

Вариант 12

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

 

I Комната III пуста II Тигр сидит в комнате I III Эта комната пуста

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

Вариант 13


Поделиться:



Популярное:

Последнее изменение этой страницы: 2017-03-09; Просмотров: 3989; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.142 с.)
Главная | Случайная страница | Обратная связь