Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.03.2013, 15:46   #1
ksu1803
Новичок
Джуниор
 
Регистрация: 11.03.2013
Сообщений: 3
Вопрос PROLOG!!!!

Помогите, пожалуйста, решить задачу!!!!
Написать программу для циклического сдвига списка вправо на заданное число элементов. Например: список [6, 5, 4, 3, 2, 1], циклически сдвинутый вправо на 2 элемента, преобразуется в список [2, 1, 6, 5, 4, 3].
ksu1803 вне форума Ответить с цитированием
Старый 11.03.2013, 15:55   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Какой маразматик даёт такие задачи на прологе?!
Цель элементарного сдвига вправо - хвост списка начиная со второго элемента, слитый со списком из первого элемента.
Цель сдвига вправо на 1 - цель элементарного сдвига вправо.
Цель сдвига вправо на n - цель сдвига вправо на n-1 цели элементарного сдвига вправо.
Как-то так, дальше копать здесь.
Abstraction вне форума Ответить с цитированием
Старый 11.03.2013, 16:29   #3
ksu1803
Новичок
Джуниор
 
Регистрация: 11.03.2013
Сообщений: 3
По умолчанию

(((((((((((((((((
ksu1803 вне форума Ответить с цитированием
Старый 12.03.2013, 12:34   #4
ksu1803
Новичок
Джуниор
 
Регистрация: 11.03.2013
Сообщений: 3
Плохо

Вроде нашла...Помогите, пожалуйста, разобраться.....
domains
CharList = Char*
predicates
цикл_сдвиг(Integer,CharList,CharLis t)
взять_посл(CharList,CharList,Char)
goal цикл_сдвиг(0,['t','r','5','n'],_List1).
clauses
цикл_сдвиг(_,[],[]):-!.
цикл_сдвиг(0,List,List):-!.
цикл_сдвиг(K,List,List0):-взять_посл(List,List1,Last),
K1=K-1,!,цикл_сдвиг(K1,[Last|List1],List0).
взять_посл([M],[],M):-!.
взять_посл([M|List],[M|List1],Last):-взять_посл(List,List1,Last).
ksu1803 вне форума Ответить с цитированием
Старый 12.03.2013, 12:41   #5
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Вот информация по теме, но на Делфи.
http://www.programmersforum.ru/showp...6&postcount=29
(алгоритм, который там содержится - не самый оптимальный)

Пролог не знаю, помочь не могу.
Вадим Мошев вне форума Ответить с цитированием
Старый 12.03.2013, 20:40   #6
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

сдвинуть вправо значит
1. оторвать от списка последний элемент (A) и получить обрубок списка (B)
2. [A|B] - результат

тебе надо вызвать такую штуку N раз

Код:
getLast([], _, _):-!, fail.
getLast([H], H, []):-!.
getLast([H|T], R, [H|RL]):-
  getLast(T, R, RL).
так ты можешь получить последний элемент и обрубок

------

тогда сдвиг запишешь так:
Код:
shift(L, [E|RL]):-
  getLast(L, E, RL),!.
целиком все можно так записать на SWI:
Код:
getLast([], _, _):-!, fail.
getLast([H], H, []):-!.
getLast([H|T], R, [H|RL]):-
  getLast(T, R, RL).

shift(L, [E|RL]):-
  getLast(L, E, RL),!.

for(I, Start, Finish):-
  Start > Finish, !, fail;
  I is Start;
  for(I, Start + 1, Finish).

clear:-
  retract(t(_)), clear;!.

tmp(L, N):-
  clear, assert(t(L)), !
  , for(_, 1, N), retract(t(L1)), shift(L1, R1), assert(t(R1)), fail.

goal:-
  L = [1,2,3,4,5], N is 3,
  tmp(L,N); retract(t(L)), write(L),nl.
про for можешь тут почитать: http://pro-prof.com/archives/817 (хотя, тут без него было бы красивей)

Код:
getLast([], _, _):-!, fail. % из пустого списка нельзя выделить последний элемент
getLast([H], H, []):-!. % если список состоит из 1 элемента - то этот элемент и есть последний, а остаток - пустой список
getLast([H|T], R, [H|RL]):- % иначе отделяет от списка первый элемент (Н), у того что осталось (Т) выделяем рекурсивно последний элемент (R) и остаток (RL), прилепляем к RL элемент H чтобы получить результат
  getLast(T, R, RL).

shift(L, [E|RL]):- % сдвиг на 1 элемент. из исходного списка L получаем последний элемент E и остаток (RL). Тогда чтобы получить результат надо к RL в начало приделать E
  getLast(L, E, RL),!.

shift(0, L, L):-!. % если требуется сдвинуть список на 1 элемент-  ничего делать ненадо
shift(N, L, R):- % если надо сдвинуть на N элементов - то 
  NN is N - 1, 
  shift(L, TL), % сдвинем на 1 элемент
  shift(NN, TL, R), !. % и рекурсивно сдвинем еще на N-1 элемент

goal:-
  L = [1,2,3,4,5], N is 3,
  shift(N, L, R), write(L), nl, write(R), nl.
Так проще и красивей )

Последний раз редактировалось rrrFer; 12.03.2013 в 21:07.
rrrFer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Prolog qip2005 Помощь студентам 0 01.12.2011 02:05
Prolog ankatito Помощь студентам 6 13.11.2011 20:53
prolog Studento4ka Помощь студентам 0 18.04.2010 11:17
Prolog Darck Angel Софт 0 17.01.2010 20:32
Prolog Debro Помощь студентам 2 26.12.2009 10:16