[Закрыть]
 
popoff.donetsk.ua
Отвечающий не всегда лжёт. Ложь может содержаться в вопросе.
Начало | Новости | Статьи | Форум | Опросы | Карта сайта | Обо мне
popoff.donetsk.ua - Форум - Функциональное и логическое программирование - задача по спискам в Prolog(контрольная на носу,а я не знаю,как справиться с заданием.подскажите,пожалуйста)

задача по спискам в Prolog(контрольная на носу,а я не знаю,как справиться с заданием.подскажите,пожалуйста)

форумы popoff.donetsk.ua
Страницы: [1]
<< Новый  |  Старый >>  |  Ответ не возможен

Внимание! Этот топик устарел. Пожалуйста, создайте новый топик, чтобы задать интересующий Вас вопрос.

Автор Сообщение
Гость Марина url://forum.message:2784
задача по спискам в Prolog(контрольная на носу,а я не знаю,как справиться с заданием.подскажите,пожалуйста)
Марина

Здравствуйте!
Помогите,пожалуйста,разобраться с языком.Задание кажется не очень сложным,но решить его у меня не получается.
Необходимо в списке символов каждую указанную последовательность заменить на другую.
то есть необходимо написать реализацию replace(L1,L2,L3,L4),где:
L1-исходный список
L2-последовательность,которую нужно заменить
L3-последовательность,на которую нужно заменить
L4-итоговый список

Удалось реализовать только замену одной буквы на список,да и то если есть второе вхождение,то замена не происходит,то есть на replace([a,b,c,d,b],b,[k,l],L) выдает L=[a,k,l,c,d,b] вместо L=[a,k,l,c,d,k,l]
Как отследить это?Может,надо сохранять где-то L3 ,потому что после конкатенации он становится пустым вроде как?

Как реализовать сравнение списков текущего хвоста L1 и списка L2? То есть как сделать так,чтоб программа заменяла не один символ,а список?

Здесь concat записыват список L2 в конец списка L1
[code=prolog]concat([],[],L3):-L3=[].
concat([],[H2|T2],[H3|T3]):-H3=H2,concat([],T2,T3).
concat([H|T],L2,[H1|T1]):-H1=H,concat(T,L2,T1).

replace([],_,_,L4):-L4=[].
replace(L1,_,[],L4):-concat([],L1,L4).
replace([H1|T1],A2,L3,[H4|T4]):-A2\=H1, H4=H1,replace(T1,A2,L3,T4).
replace([H1|T1], A2,L3,[H4|T4]):-A2=H1,concat(L3,T1,[H4|T4]).[/code]

popoff
Yuri
Июл, 2004
Сообщений: 931
popoff url://forum.message:2787

Если решать в лоб, без всяких оптимизаций, то потребуются примерно такие предикаты:

1. Главный. Назовём его replace. Ходит по исходному списку, в котором нужно что-то менять и вызывает предикат is_prefix для всего текущего хвоста списка L1, чтобы проверить, является ли L2 начальным подсписком текущего хвоста L1. Если является, то на обратном ходе рекурсии L4 формируете как конкатенацию L3 + текущий хвост L1 без префикса L2, иначе говорите, что L4 просто равен текущему хвосту L1.

2. Предикат is_prefix вызывается из replace и получает на вход три аргумента L1 (в качестве этого аргумента replace будет передавать текущий ховст списка L1), список L2 и возвращать через третий аргумент L1, из которого удалён L2 в случае, если L2 является начальлным подсписком L1, иначе возвращает L1 без изменений.

3. Предикат concat будет использоваться внутри replace в случае, если is_prefix возвращает истину - для того, чтобы подставить подсписок L3 в список L1 на место удалённого L2. Этот предикат зависит от трёх аргументов L1,L2,L3 и L3 равен конкатенации список L1 и L2.

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

________________________________
Если не будет деревьев — нам нечем будет дышать, если вода загрязнится — нам нечего будет пить.

Внимание! Этот топик устарел. Пожалуйста, создайте новый топик, чтобы задать интересующий Вас вопрос.

Страницы: [1]
<< Новый  |  Старый >>  |  Ответ не возможен
Вход
Поиск[?]:
Программное обеспечение любой сложности
koins.com.ua