Во-первых, я полагаю, что what
является псевдонимом example
и ваши правила действительно похожи, что:
example(A, [A|As], As).
example(A, [B|Bs], [B|Cs]) :- example(A, Bs, Cs).
Тогда дела идут так:
?- example(c, [a, b, c, a], X).
Сейчас мы ищем соответствующий договор:
example(c, [a, b, c, a], X) = example(A, [A|As], As).
Этот номер false. Поэтому мы стараемся следующий:
example(c, [a, b, c, a], X) = example(A, [B|Bs], [B|Cs]).
Это один работает, и мы получаем результаты:
X = [a|Cs],
A = c,
B = a,
Bs = [b, c, a].
Так мы получаем:
example(c, [a, b, c, a], [a|Cs]) = example(c, [a|[b, c, a]], [a|Cs]).
Из второго правила example/3
мы знаем, что:
example(c, [a|[b, c, a]], [a|Cs]) :- example(c, [b, c, a], Cs).
Таким образом, мы сделать процесс снова, и мы получим:
example(c, [b, c, a], Cs) = example(A, [B|Bs], [B|Cs]).
Какие результаты в:
Cs = [b|Cs],
A = c,
B = b,
Bs = [c, a]
Это означает, что:
example(c, [b, c, a], [b|Cs]) = example(c, [b|[c, a]], [b|Cs]).
И снова из второго правила:
example(c, [b|[c, a]], [b|Cs]) :- example(c, [c, a], Cs).
Итак, мы ищем другой матч - на этот раз сначала Правило:
example(c, [c, a], Cs) = example(A, [A|As], As).
Теперь мы имеем:
Cs = As,
As = [a],
A = c.
А теперь мы можем вернуться назад и значения передаточных Cs.Это то, что мы имеем сейчас:
Cs = As = [a],
Двигаемся это с предыдущими результатами:
OldCs = [b|Cs] = [b,a]
И с предыдущими результатами:
X = [a|OldCs] = [a,b,a].
Вместо этого, используйте запрос 'пример (E , [A, B, C], Xs) .' и посмотрите на * все * ответы. Трассировка не очень эффективна в присутствии объединения. И 's/what/example /' – false