2013-05-15 2 views
1

Рассмотрим:путаются ответ Пролога

bar([], Ws, Ws). 
bar([X|Xs], Ys, [X|Zs]) :- bar(Xs, Ys, Zs). 

1) Как не это имеет не решения

bar([1,2], [], [X,X]). 

2) Как это имеет только одно решение, когда Z = 5?

bar([5,Y], [Y,5], [Z,Z|_]). 

3) Как это имеет только одно решение, когда Z = 5 и Y = 5?

bar([_,Y], [5,5], [Z,Z,Z|_]). 

ответ

1

Сначала рассмотрим значение bar/3: правило имеет три аргумента, представляющие списки. bar/3 возвращает решение, когда последний список представляет собой объединение двух первых:

bar([1,2,3], [4,5], X)  // X=[1,2,3,4,5] 
bar([1,2,3], X, [1,2,3,4,5]) // X=[4,5] 
bar(X, [4,5], [1,2,3,4,5]) // X=[1,2,3] 

Зная это, вы можете понять ответы на все ваши вопросы:

  • bar([1,2], [], [X,X]). потребность X объединить с 1 и 2 в то же самое время, что невозможно
  • bar([5,Y], [Y,5], [Z,Z|_]). объединяет 5 с первой Z, а второй Z с Y, для одного раствора
  • bar([_,Y], [5,5], [Z,Z,Z|_]). объединяет Y со вторым Z , а третий Z с 5 для одного решения.
+0

ОК, я вижу сейчас. Есть ли у вас какое-либо предложение найти смысл вещей, таких как bar/3? Кажется, у меня проблемы с визуализацией этого шага. –

+0

@WilliamMcCarty Это несколько сложно, и он становится очень сложным, так как число правил повышается. Пройдите каждое правило и выясните, что он делает на высоком уровне, начиная с правил сокращения и возвращаясь к базовому регистру. В 'bar' правило сокращения проверяет, что списки 1 и 3 имеют один и тот же элемент в голове, а затем уменьшают элемент head. Базовый регистр проверяет, что приведенный список 3 совпадает с списком 2. Объединение этих двух шагов в один приводит к наблюдению, что начальная часть списка 3 должна соответствовать списку 1, а хвостовая часть должна соответствовать списку 2. – dasblinkenlight

+0

Очень Теперь просвещение становится намного больше, спасибо большое. –