Решение суперкомпилятором Scp4 задачи А. Эйнштейна
ryba.zip - все программы,
rybabat.htm - задание на суперкомпиляцию,
rybamst.htm - MST-схема,
rybaref.htm - рефал-программа,
rybarref.htm - результат суперкомпиляции.
Резюме. Рассматривается задача, предложенная А.Эйнштейном. Он утверждал, что эту задачу способны решить лишь 2% людей. Предлагается программа, при суперкомпиляции которай за 1 час 30 минут получается решение задачи. Опыт показывает, что 2% людей решают эту задачу примерно за это же время.
Ранее на сайте http://www.refal.net/~korlukov/pearls/ в главе "Рекурсивные числа" приводилась программа, которая суперкомпилируется в несколько раз быстрее, чем исполняется.
Здесь наблюдается аналогичная картина. Предложенный алгоритм соответствует перебору 525 случаев. Это число равно 298023223876953125, примерно 1018 , т.е. миллиард миллиардов. Поэтому очень затруднительно измерить время непосредственного исполнения программы (исполнение займет многие годы).
Формулировка задачи.
ЧИСТАЯ ЛОГИКА
А. Эйнштейн придумал эту загадку в прошлом веке и полагал, что 98 процентов жителей Земли будут не в состоянии ее решить.
Принадлежите ли вы к 2 процентам самых умных людей планеты?
1. Есть 5 домов каждый разного цвета.
2. В каждом доме живет один человек, отличающийся от соседнего по национальности: немец, англичанин, швед, датчанин, норвежец.
3. Каждый пьет только один определенный напиток, курит определенную марку сигарет и держит определенное животное.
4. Никто из 5 человек не пьет одинаковые с другими напитки, не курит одинаковые сигареты и не держит одинаковое животное.
Вопрос: кому принадлежит рыба?
Подсказки:
1. Англичанин живет в красном доме.
2. Швед держит собаку.
3. Датчанин пьет чай.
4. Зеленый дом стоит слева от белого.
5. Жилец зеленого дома пьет кофе.
6. Человек, который курит Pall Mall, держит птицу.
7. Жилец из среднего дома пьет молоко.
8. Жилец из желтого дома курит Dunhill.
9. Норвежец живет в первом доме.
10. Курильщик Marlboro живет около того, кто держит кошку.
11. Человек, который держит лошадь, живет около того, кто курит Dunhill.
12. Курильщик сигарет Winfield пьет пиво.
13. Норвежец живет около голубого дома.
14. Немец курит Rothmans.
15. Курильщик Marlboro живет по соседству с человеком, который пьет воду.
Решение задачи.
Предлагается программа rybaref.htm на языке программирования Рефал, исходными данными которой является конфигурация вида
(s.11 s.12 s.13 s.14 s.15) (s.21 s.22 s.23 s.24 s.25) (s.31 s.32 s.33 s.34 s.35) (s.41 s.42 s.43 s.44 s.45) (s.51 s.52 s.53 s.54 s.55)
Под эту конфигурацию подходит, например, ответ к задаче
(Norwegian Yellow Dunhill Cat Water ) (Dane Blue Marlboro Horse Tea ) (Englishman Red PallMall Bird Milk ) (German Green Rothmans Fish Coffee) (Swede White Winfield Dog Beer )
Программа проверяет, подходят ли исходные данные под условие задачи. Если "да", то строится ответ на вопрос задачи, если "нет", то происходит аварийная остановка "отождествление невозможно".
Результат суперкомпиляции rybarref.htm выглядит так
ryba1 { Norwegian Yellow Dunhill Cat Water Dane Blue Marlboro Horse Tea Englishman Red PallMall Bird Milk German Green Rothmans Fish Coffee Swede White Winfield Dog Beer = German ; }
Суперкомпилируемая программа состоит из 20 вложенных фильтров - 15 фильтров соответствуют 15 подсказкам в условии задачи, оставшиеся 5 фильтров проверяют наличие каждого объекта из условия по одному разу.
Реально запрограммировано только условие задачи, никакие действия по организации перебора и циклов не проводились.
Любопытно было бы сравнить следующие два времени:
Количество всех случаев равно 525 = 298023223876953125, примерно 1018 , т.е. третья часть от миллиарда миллиардов. Даже если компьютер будет перебирать миллиард случаев в секунду, то это займет 9 лет.