Итак, начнем с natural_number(P)
.Прочитайте это как «P - натуральное число».Нам дается natural_number(0).
, что говорит нам о том, что 0
всегда является натуральным числом (то есть нет никаких условий, которые должны быть выполнены, чтобы это было фактом).natural_number(s(X)) :- natural_number(X).
говорит нам, что s(X)
- натуральное число, если X
- натуральное число.Это нормальное индуктивное определение натуральных чисел, но записанное «в обратном направлении», когда мы читаем пролог «Q: = P» как «Q истинно, если P истинно».
Теперь мы можем посмотреть на plus(P, Q, R)
,Прочитайте это как "plus
верно, если P плюс Q равно R".Затем мы рассмотрим случаи, которые нам даны:
plus(0,X,X) :- natural_number(X).
.Читайте как Добавление 0 к X приводит к X, если X - натуральное число.Это наш индуктивный базовый случай и является естественным определением сложения. plus(s(X),Y,s(Z)) :- plus(X,Y,Z).
Читать как «Добавление преемника X к Y приводит к преемнику Z, если добавление X к Y равно Z». Если мыизмените обозначение, мы можем прочитать его алгебраически как «X + 1 + Y = Z + 1, если X + Y = Z», что снова очень естественно.
Итак, чтобы ответить на прямой вопрос«Если у меня есть plus(s(0),s(s(s(0))),z)
, как я могу получить ответ 1 + 3 = 4?», Давайте рассмотрим, как мы можем объединить что-то с z на каждом шаге индукции
- Применить второе определениеиз
plus
, поскольку это единственное, которое объединяется с запросом. plus(s(0),s(s(s(0))), s(z'))
верно, если plus(0, s(s(s(0))), z')
верно для некоторых z
- Теперь примените первое определение плюса, так как это единственноеобъединяющее определение:
plus(0, s(s(s(0))), z')
, если z'
равно s(s(s(0)))
и s(s(s(0)))
- натуральное число. - Несколько раз разверните определение
natural_number
на s(s(s(0)))
, чтобы увидеть, что это правда. - Таким образом, общее утверждение верно, если
s(s(s(0)))
объединено с z'
и s(z')
объединено с z
.
Таким образом, интерпретатор возвращает true, с z' = s(s(s(0)))
и z = s(z')
, то есть z = s(s(s(s(0))))
.Итак, z
равно 4.