2014-11-30 2 views
0

Учитывая следующие правила:Пролог - трассировка правило

example(A, [A|As], As). 
example(A, [B|Bs], [B|Cs]) :- what(A, Bs, Cs). 

и запрос:

example(c, [a, b, c, a], X). 

результаты:

X = [ a, b, a ] 

Может кто-нибудь помочь мне проследить, как она делает это? Я не уверен, на каком примере он идет первым, и я уверен, что смогу понять это.

+0

Вместо этого, используйте запрос 'пример (E , [A, B, C], Xs) .' и посмотрите на * все * ответы. Трассировка не очень эффективна в присутствии объединения. И 's/what/example /' – false

ответ

1

Во-первых, я полагаю, что 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]. 
Смежные вопросы