quelqu'un peut me aider à comprendre cet exemple récursive Prolog?
-
27-10-2019 - |
Question
ici est le plus code que je ne comprends pas
plus(0,X,X):-natural_number(X).
plus(s(X),Y,s(Z)) :- plus(X,Y,Z).
tout donné:
natural_number(0).
natural_number(s(X)) :- natural_number(X).
Je ne comprends pas ce récursivité. Si je plus(s(0),s(s(s(0))),Z)
comment puis-je obtenir la réponse de 1+3=4
?
Je besoin d'explications pour le premier code. J'essaie que plus(0,X,X)
arrêtera la récursion mais je pense que je le fais mal.
La solution
Alors, commençons par natural_number(P)
. Lisez ce que « P est un nombre naturel ». On nous donne natural_number(0).
, qui nous dit que 0
est toujours un nombre naturel (à savoir qu'il n'y a pas des conditions qui doivent être remplies pour qu'il soit un fait). natural_number(s(X)) :- natural_number(X).
nous dit que s(X)
est un nombre naturel si X
est un nombre naturel. Telle est la définition inductive normale des nombres naturels, mais écrit « à l'envers » comme nous le lisons Prolog « Q: = P ». Comme « Q est vrai si P est vrai »
Maintenant, nous pouvons regarder plus(P, Q, R)
. Lisez ce que « plus
est vrai si P plus Q est égal à R ». Nous examinons ensuite les cas qu'on nous donne:
-
plus(0,X,X) :- natural_number(X).
. Lire l'ajout 0 aux résultats X dans X si X est un nombre naturel. Ceci est notre cas de base inductive, et est la définition naturelle de l'addition. -
plus(s(X),Y,s(Z)) :- plus(X,Y,Z).
Lire comme « Ajout du successeur de X aux résultats Y dans le Z successeur si vous ajoutez X à Y est Z ». Si nous changeons la notation, nous pouvons le lire algébriquement comme « X + 1 + Y = Z + 1 si X + Y = Z », qui est encore très naturel.
Alors, pour vous répondre à la question directe: « Si je plus(s(0),s(s(s(0))),z)
, comment puis-je obtenir la réponse de 1 + 3 = 4? », Nous allons examiner comment nous pouvons unifier quelque chose avec z chaque étape de l'induction
- Appliquer la deuxième définition de
plus
, car il est le seul qui unifie avec la requête.plus(s(0),s(s(s(0))), s(z'))
est vrai siplus(0, s(s(s(0))), z')
est vrai pour certainsz
- Maintenant, appliquez la première définition de plus, car il est la seule définition unifiant.
plus(0, s(s(s(0))), z')
siz'
ests(s(s(0)))
ets(s(s(0)))
est un nombre naturel - Déroulez la définition de
natural_number
quelques fois surs(s(s(0)))
pour voir ce qui est vrai. - Donc, la déclaration générale est vrai, si
s(s(s(0)))
est unifié avecz'
ets(z')
est unifié avecz
.
Alors l'interprète retourne vrai, avec z' = s(s(s(0)))
et z = s(z')
, à savoir z = s(s(s(s(0))))
. Donc, z
est 4.
Autres conseils
Ce code est une implémentation simple de plus de Peano.
En arithmétique Peano, des nombres naturels sont représentés à l'aide du 0
constante et la s
de fonction unaire. Alors s(0)
est une représentation de 1, s(s(s(0)))
est la représentation de 3. Et plus(s(0),s(s(s(0))),Z)
vous donnera Z = s(s(s(s(0))))
, qui est une représentation de 4.
Vous n'obtiendrez des termes numériques comme 1+3=4
, tout ce que vous obtenez est le terme s/1
qui peut s'intégrer à une profondeur et peut donc représenter un nombre naturel. Vous pouvez combiner ces termes (en utilisant plus/3
) et obtenir ainsi la somme.
Notez que votre définition de plus/3
n'a rien à voir avec haut-plus/3
de SWI-Prolog (qui fonctionne avec des nombres entiers et non avec les termes de s/1
):
?- help(plus).
plus(?Int1, ?Int2, ?Int3)
True if Int3 = Int1 + Int2.
At least two of the three arguments must be instantiated to integers.