2013-04-23 3 views
0

Мне нужна помощь с тремя прологами для проверки и управления списками. Я новичок в прологе, и любая помощь будет высоко оценена.Пролог Список предикатов

Три предикаты:

  • double_up(+List1, -List2) верно, когда List2 имеет каждый элемент List1 дважды. В запросе double_up([a,b,c],X) следует указать X=[a,a,b,b,c,c]. Порядок элементов в выходном списке не имеет значения.
  • pivot(+List1, +Pivot, -Smaller, -GreaterEq) верно, когда Smaller список чисел в List1 меньшем, чем Pivot и GreaterEq список чисел в List1 больше или равно Pivot.
  • fancy_replace(+List, +Takeout,+Putin, -NewList, -Count) верно, когда NewList тот же список в качестве входного сигнала List, но где каждый Takeout элемент в списке заменяется Putin элементом. Счет должен быть числом Отмененных, которые были заменены. Например, запрос fancy_replace([9,10,1,9,2],9,0, X, C) должен содержать X = [0,10,1,0,2] и C = 2. Порядок элементов в выходном списке не имеет значения.
+2

Ждать. Путин? Какие? –

+1

У меня была такая же реакция :) Надеюсь, КГБ не предупредит об этом ... – CapelliC

ответ

-1

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

я думаю, что это хорошая ссылка, как у меня было трудно понять, как пролог работает пару недель назад , what does the follow prolog codes do?

в любом случае .. это ответ для вашей первой проблемы; Надеюсь, вы могли бы решить самостоятельно отдыхать: D

double([]). 
double([H|[]], [H,H|[]]). 
double([H|T],[H,H|T1]):- double(T, T1). 

Кстати, это не может быть единственным решением ... но это работает

+0

Я не могу думать, что вы могли бы сделать с разработчиком уродливого и сложного языка (например ... choice one :) – CapelliC

+1

Второе предложение подпадает под третье предложение, вы можете удалить его. Кроме того, вы можете написать '[H | []]' просто как '[H]' и '[H, H | []]' как '[H, H]'. – mat

1

Чем проще шаблон для обработки списков в Прологе накладывает рекурсивный предикат 2 аргументы, совпадение - условно - входные и выходные данные и базовый регистр, останавливающий рекурсию, сопоставляя пустой список. Тогда

double_up([X|Xs], [X,X|Ys]) :- double_up(Xs, Ys). 
double_up([], []). 

Этот предикат это немного более общую чем то, что требуется, так как он работает и в режиме double_up(-List1, +List2). Например

?- double_up(L,[1,1,2,2]). 
L = [1, 2]. 

Чтобы ограничить его режим по мере необходимости, я думаю, что это необходимо бесцельно усложнять код, перемещаясь, что чистый цикл в предикате службы, и оставляя double_up просто проверить аргументы:

double_up(I, O) :- is_list(I), var(O), double_up_(I, O). 
double_up_([X|Xs], [X,X|Ys]) :- double_up_(Xs, Ys). 
double_up_([], []). 

ось/4 может быть 'один вкладыш' в SWI-Prolog:

pivot(List1, Pivot, Smaller, GreaterEq) :- 
    partition(>(Pivot), List1, Smaller, GreaterEq). 

, как перегородки, foldl из библиотеки (apply) это простая реализация последнего требуемого предиката:

fancy_replace(List, Takeout, Putin, NewList, Count) :- 
    foldl(swap_n_count(Takeout, Putin), List, NewList, 0, Count). 
swap_n_count(Takeout, Putin, L, N, C0, C) :- 
    ( L == Takeout 
    -> N = Putin, C is C0 + 1 
    ; N = L, C = C0 
    ). 
Смежные вопросы