Вот часть кода Пролога, определяющего цифру рекурсивным способом:
numeral(0).
numeral(succ(X)) :- numeral(X).
При получении запроса numeral(X).
Пролог вернет:
X = 0 ;
X = succ(0) ;
X = succ(succ(0)) ;
X = succ(succ(succ(0))) ;
X = succ(succ(succ(succ(0)))) ;
X = succ(succ(succ(succ(succ(0))))) ;
X = succ(succ(succ(succ(succ(succ(0)))))) ;
X = succ(succ(succ(succ(succ(succ(succ(0))))))) ;
X = succ(succ(succ(succ(succ(succ(succ(succ(0))))))))
yes
На основании того, что у меня естьузнал, что при выполнении запроса пролог сначала создает X
в переменную, подобную (_G42)
, а затем ищет факты и правила, чтобы найти совпадение.
В этом случае он найдет 0
(факт) как правильный матч.Затем он также попытается соответствовать правилу.Это означает, что _G42
- это не 0
, а _G42
- это помощь другого числа.Таким образом, генерируется другая переменная (например, _G44
), _G44
будет соответствовать 0
, а также будет идти дальше, как _G42
.Так как _G44
соответствует 0
, то оно вернется к _G42
, получив _G42 = succ(_G44) = succ(0)
.
Я не уверен, правильно ли я понял.Я сделал диаграмму, чтобы показать свое понимание этой проблемы.![diagram of numeral search](https://i.stack.imgur.com/TDkNo.jpg)
Если анализ верен, мне все еще трудно спроектировать рекурсивную функцию, подобную этой.Поскольку я новичок в Прологе, я хочу знать, всегда ли этот вид определения используется в приложении (скажем, построение экспертной системы, проверка протоколов) или это только для начинающих, чтобы лучше понять основную процедуру поиска?Если это часто используется, какова ключевая точка для разработки такого рода рекурсивного определения?