2016-11-28 12 views
0

я получил следующую базу знаний, которая, как предполагается, чтобы добавить два аргумента и дают результаты:Пролог рекурсивной

add(0,X,X). 
add(succ(X),Y,succ(R)):- add(X,Y,R). 

Теперь это мой запрос:

?- add(succ(succ(succ(0))), succ(succ(0)), Result). 

0 делает не объединяйтесь с первым аргументом, поэтому он переходит ко второму предложению add/3. Теперь вот что я не могу понять. Книга (LPN) говорит мне, что самый внешний фактор succ сперва от первого аргумента, но я не могу понять, почему? По моему мнению, он добавляет succ-функтора. Может ли кто-нибудь объяснить, почему он его отключает?

Заранее благодарен!

Luuk

+0

Пожалуйста, добавьте больше информации об этой книге. LPN не хватает – false

ответ

2

Попробуйте это на вашей верхней строке уровня:

?- succ(succ(0)) = succ(X). 

Перед тем, как ввести <Enter>, что вы думаете, что решение будет?


«зачистка», что книга говорит о том, происходит между главой второго пункта, add(succ(X), ...) и рекурсивным вызовом add(X, ...).

На самом деле я не вижу добавленной стоимости разговоров о «зачистке». Что на самом деле происходит то, что, если первый аргумент add/3 является членом с функтором succ/1 (так ничего на все, что выглядит как succ(<Whatever>), то X будет унифицировано с этим <Whatever> В случае запроса:.

?- add(succ(succ(succ(0))), succ(succ(0)), Result). 

<Whatever> является succ(succ(0)), поэтому X унифицирована с succ(succ(0)), и это первый аргумент рекурсивного вызова add/3.

+0

Спасибо большое, я м, наконец, смог увидеть, как это работает на запрос, который вы мне дали! –

+2

's (X)' for: "перед тем, как ввести тип" – false

+1

@false Работать с трудными для них (X) 's –