Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Теория алгоритмов]Машина Шёнфилда 
:(
    Опции темы
breaking
Дата 11.1.2009, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 24.2.2007

Репутация: 1
Всего: 1



Помогите составить Машину Шёнфилда для следующей функции:
f(x,y) = |x-y|
PM MAIL   Вверх
andrew_121
Дата 11.1.2009, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 0
Всего: 33



breaking, Гугл тебе в руки.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
breaking
Дата 13.1.2009, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 24.2.2007

Репутация: 1
Всего: 1



Понимаешь тут особо и гуглить ничего не надо. Основную идею я понимаю, просто никак не могу понять один момент, сейчас объясню более конкретно. Программирование машин Шёнфилда чем-то напоминает программирование на языке Assembler:
Машина Шёнфилда имеет бесконечное число регистров, пронумерованных натуральными числами, начиная с 0. Каждый из этих регистров может содержать любое натуральное число. Для любой программы нам будет необходимо лишь конечное число регистров, которое нетрудно заранее определить по программе. Кроме этого у машины есть специальная память для программы, а также счётчик команд, всегда содержащий некоторое натуральное число.
Программа для машины Шёнфилда состоит из конечного списка команд, последовательно пронумерованных натуральными числами начиная с 0.
Перед запуском в машину вводится программа, в регистры заносятся начальные данные, а в счётчик команд заносится значение 0. После этого шаг за шагом осуществляется работа машины.
Шаг машины состоит в исполнении команды, номер которой указан в счётчике команд. Если такого номера команды нет, то машина останавливается.
Существеует два типа команд:
  • INC I - увеличивает содержимое I-го регистра на 1 и увеличивает содержимое счётчика команд на 1. После этого машина переходит к следующему шагу.
  • DEC I, n - если содержимое I-го регистра больше нуля, то уменьшает содержимое I-го регистра на 1 и заносит n в счётчик команд. Если содержимое I-го регистра равно 0, то увеличивает содержимое счётчика команд на 1.
Процесс вычисления некой функции f(x1, ..., xn) на машине Шёнфилда будет состоять в следующем: i-е значение аргумента функции заносим в I-й регистр и запускаем машину; если машина останавливается, то значение функции - это значение в регистре 0; в противном случае считаем, что значение функции не определено на данном наборе аргументов.

Вот несколько макросов:

Макрос GOTO n
0: INC 0
1: DEC 0, n
Макрос ZERO I. Этот макрос, который обнуляет содержимое I-го регистра. Состоит такой макрос всего из одной команды - DEC I, 0.
Макрос [i] -> [j], (k), где i, j != k. Этот макрос копирует содержимое i-го регистра в j-й регистр, используя k-й регистр в качестве вспомогательного. Содержимое i-го регистра при i != j не изменяется. Программа для макроса [i] -> [j], (k) при i != j выглядит так:
0: ZERO j
1: ZERO k           обнулили j-й и k-й регистры
2: GOTO 5          переход на 5-ю команду
3: INC j
4: INC k
5: DEC i, 3          если в i-м регистре не 0, увеличим i-й и k-й регистры
6: GOTO 8
7: INC i
8: DEC k, 7         копирование из k-го регистра в i-й
Если i = j, то можно взять любую программу, которая ничего не меняет, например
0: GOTO 1
Макрос F([i1], ..., [ik] -> [j] вычисляет значение функции F, вычислимой по Шёнфилду с помощью программы P, от содержимого регистров [i1], ..., [ik], записывает это значение в j-й регистр и при этом не изменяет значения остальных регистров.
Следующая машина определяет функцию сложения sum(x, y) = x + y
0: [2] -> [0]
1: GOTO 3
2: INC 0
3: DEC 1, 2
Для функции умножения mult(x, y) = x * y
0: ZERO 0
1: GOTO 3
2: sum([0], [2]) -> [0]
3: DEC 1, 2

А теперь возвратимся к моей задаче - f(x,y) = |x-y|. Как можно прочитать выше регистры могут содержать только натуральные числа, т.е. отрицательных там быть не может. В таком случае как же реализовать нужную мне функцию и, к примеру,  функцию вычитания - sub(x,y) = x - y???
Вот мой пример реализации sub(x,y) = x - y
0: [1] -> [0]
1: INC 0
2: DEC 0, 4
3: GOTO 5
4: DEC 2, 2
Но он по ходу неверный...
PM MAIL   Вверх
solverr
Дата 15.1.2009, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 31.12.2008

Репутация: 1
Всего: 1



0. DEC 1, 2 
1. GOTO 4
2. DEC 2, 0
3. INC 1
4. ZERO 0
5. DEC 1, 7
6. GOTO 9
7. INC 0
8. GOTO 5
9. DEC 2, 11
10. GOTO 13
11. INC 0
12. GOTO 9
13. HAPPY END
PM MAIL   Вверх
Aplles
  Дата 7.5.2009, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 7.5.2009

Репутация: нет
Всего: нет



Преветcтвую всех. Что-то никак не вникну в смысл машин Шёнфилда, и потому помогите плиз составить машину Шёнфилда для функции:
f(x,y) = x^y и f(x,y) =|sqrt(x)|
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

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

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0649 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.