Чтобы понять программу Prolog, у вас есть два варианта:
- Подумайте о программе, как вы делаете это на других языках программирования, симулируя движения процессора.Это очень скоро приведет к вашему психическому раздражению, если только вас не зовут Райзен или другими словами:
- Пусть Пролог рассудит и использует Пролог для понимания программ.
Всякий раз, когда вы видите неудачную цель, сузьте причину неудачи цели, обобщив эту цель (заменив некоторый термин переменной).Вам не нужно понимать точное определение на всех .Достаточно попробовать вещи.В случае вашего запроса
?- append([], [X1], [a,b]).
false.
У нас есть три аргумента.Может быть, первый виновник?Поэтому я заменю его новой переменной:
?- append(Xs, [X1], [a,b]).
Xs = [a],
X1 = b ;
false.
Пригвожден!Изменение первого аргумента приведет к успеху.Но как насчет второго аргумента?
?- append([], Ys, [a,b]).
Ys = [a, b].
Опять же, виновник тоже.А теперь для третьего:
?- append([], [X1], Zs).
Zs = [X1].
Вердикт: все трое виноваты.То есть достаточно обвинить одного из них.Какой из них вам решать.
Делайте это всякий раз, когда вы сталкиваетесь с неудачной целью.Это поможет вам получить реляционное представление, которое делает Prolog таким особенным языком.
И если мы на нем.Часто помогает учитывать максимальные ошибочные обобщения .То есть, обобщения, которые все еще терпят неудачу, но где каждый следующий шаг ведет к успеху.В вашем примере это:
?- append([], [X1], [a,b]). % original query
false.
?- append([], [_], [_,_|_]). % maximal failing generalization
false.
Из этого вы уже можете сделать некоторые выводы:
Элементы списков не имеют значения.
Актуальна только длина трех списков
Третий список должен состоять из двух элементов или длиннее.