Пролог — Дважды Список

Я практикую пролог и все такое, и это убивает меня. Попытка сделать это:

twice([1,2,3],X).

результат, который я хочу,

X = [1,1,2,2,3,3].

Вот моя последняя попытка:

twice([HD|TL],[HD2|TL2]):-
    twice(TL,[HD,HD2|TL2]).

twice([],[HD|TL]).

//Новый

twice([],[]).
twice([A|B],Out):- twice([A|B],[A,A|Rest],
                   twice(B,Rest).

person HTLINK    schedule 13.12.2013    source источник
comment
дважды из ничего - это...   -  person CapelliC    schedule 13.12.2013
comment
дело в том, что проблема говорит использовать только список и recusive. Нет другого расширенного синтаксиса.   -  person HTLINK    schedule 13.12.2013
comment
Попытайтесь думать о своих предикатах логически. @CapelliC указывает, что twice([], [HD|TL]). - это предикат, говорящий, что дважды пустой список (ничего) - это... что? [HD|TL]? Это было бы не логично.   -  person lurker    schedule 13.12.2013
comment
Ваш новейший код по-прежнему нелогичен. Он дважды говорит, что [A|B] есть Out, но затем дает определение, которое не включает Out. Подумайте: как должно выглядеть Out? Разве это не будет список с повторением A перед ним? Таким образом, заголовок этого предложения должен быть twice([A|B], [A,A|C]) (дважды [A|B] — это список, похожий на [A,A|C] if...), а тело завершает if, определяя, как связаны B и C.   -  person lurker    schedule 13.12.2013
comment
Это дубликат stackoverflow.com/questions /20319473/   -  person SQB    schedule 13.12.2013
comment
Хорошо, так что проблема была в том, что я пожинал плоды тогда ... Теперь я был в том, что моя ошибка была ... Спасибо, теперь я буду практиковаться с другими. Спасибо, Боже, я еще не хожу на занятия ›.‹   -  person HTLINK    schedule 13.12.2013


Ответы (3)


Начните с базового случая,

twice([], 

"дважды из ничего"... ничего, верно?

          []).

А что, если там что-то есть?

twice([A|B], 

тогда что? мы хотим, чтобы результат начинался с A? Спорим,

              [A,

что там дальше?

                  ...

(заполните, пожалуйста). Потом остальное:

                       | Rest] ):-

Итак, продолжаем. Rest взято из B:

      twice(B, ...).

заполните и это, пожалуйста.

person Will Ness    schedule 13.12.2013
comment
Я знаю, как работает рекурсия, часть списка мне не подходит. Базовый случай в порядке. Но дело в том, что я не знаю, что делать, чтобы добавить другие данные в список того же HD из первого списка. Меня немного смущает ... и я понял вышеизложенное, но чего я не вижу, так это добавления одной и той же части HD 2 раза. - person HTLINK; 13.12.2013
comment
@ user3096350 вам нужно написать только одну вещь вместо ... там, в спецификации списка [A, ... | Rest]. Например, [1, 2 | [3,4]] — это еще один способ записать список [1,2,3,4]. Что делать, если вы хотите 1 дважды? Тогда это [1, 1 | [3,4]], то же, что и [1,1,3,4], то же, что и A=1, [A,A | B], B=[3,4]. - person Will Ness; 13.12.2013
comment
@ user3096350, вы можете отредактировать свой вопрос, но ничего в нем не меняйте! Вы можете добавить новый код. - person Will Ness; 13.12.2013
comment
Всегда дает мне ложь: / и ничего не делает. ЧТО НЕ ТАК С U PROLOG! - person HTLINK; 13.12.2013
comment
@user3096350 user3096350 вставьте куда-нибудь свой код или добавьте его сюда в конце своего вопроса. под ним есть опция редактирования. - person Will Ness; 13.12.2013
comment
@user3096350 user3096350 не могли бы вы просто расставить точки в моем коде, пожалуйста. Это будет намного проще. Скопируйте, сотрите весь текст, выровняйте код и заполните точки. :) - person Will Ness; 13.12.2013
comment
@WillNess: какое терпение! - person CapelliC; 14.12.2013
comment
@CapelliC Мне помогли друзья :) в комментариях. :) - person Will Ness; 14.12.2013
comment
@CapelliC (другим хорошим ответом было бы: спокойствие сейчас, безумие позже!, хе-хе :) youtube. com/watch?v=Ow_9MglZrhs ). - person Will Ness; 03.06.2015
comment
@WillNess: хорошо, я не могу полностью понять шутки (английское правописание такое сложное...), но у меня есть настроение - person CapelliC; 03.06.2015

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

onlyonce([], []).
onlyonce([Head | Tail], [Head | NewTail]) :-
    onlyonce(Tail, NewTail).

Первый пункт очевиден.

Второй пункт означает:

  • первый аргумент (вход) — непустой список. Назовите первый элемент этого списка «Голова», остальные элементы этого списка назовите «Хвост».
  • второй аргумент — непустой список. Первый элемент этого списка такой же, как и в первом списке аргументов "Head" (т. е. первый элемент входного списка скопирован один раз). Назовите остальные элементы списка «NewTail».
  • «NewTail» можно получить из «Tail» (и наоборот) с помощью предиката «onlyonce».

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

person Sergii Dymchenko    schedule 13.12.2013

Попробуй это:

twice([], []).
twice([A|B], [A,A|Rest]) :- twice(B, Rest).
person Vyas Balimidi    schedule 20.07.2018