2013-05-27 2 views
0

Voici un extrait de cryptarithmetic dans Prologque signifie C1 dans le puzzle cryptarithmétique de polog?

sum1([D1|N1], [D2|N2], [D|N], C1, C, Digs1, Digs) :- 
    sum1(N1, N2, N, C1, C2, Digs1, Digs2), 
    digitsum(D1, D2, C2, D, C, Digs2, Digs). 

Comme ci-dessous explique

sum1(N1, N2, N, C1, C, Digits1, Digits) 
where N1, N2 and N are our three numbers, 
     C1 is carry from the right, and 
     C is carry to the left (after the summation). 
     Digits1 is the list of available digits for instantiating the 
     variables in N1, N2, and N. 
     Digits is the list of digits that were not used in the 
     instantiation of these variables. 

Je ne comprends vraiment pas qu'est-ce que C1 signifie en sum1([D1|N1], [D2|N2], [D|N], C1, C, Digs1, Digs), C2 représente sous forme de transport à droite, C signifie porter à gauche, alors que signifie C1?

Répondre

1

C, C1, C2 ne peut prendre que 0,1 valeur. Les règles arithmétiques exigent que C1 soit 0 dans le premier appel et C dans le dernier appel. C2 devient C sur appel récursif, puis il propage le report après la somme. C1 c'est le report ajouté à N1, N2 pour obtenir N.

+0

nice! pourquoi ne pas le simplifier comme 'sum1 ([D1 | N1], [D2 | N2], [D | N], C, Digs1, Digs): - somme1 (N1, N2, N, C2, Digs1, Digs2), digitsum (D1, D2, C2, D, C, Digs2, Digs). »Pour C1 ne modifie jamais dans l'appel récursif et toujours être zéro? – stonestrong

+0

oh! cela peut vraiment être simplifié et les tests réussissent, mais nous devrions aussi changer de cas de base. dans le livre de Bratko, somme (N1, N2, N): -sum1 (N1, N2, N, 0, 0, [0,1,2,3,4,5,6,7,8,9] , _). ', et le cas de base est' sum1 ([], [], [], C, C, chiffres, chiffres). Maintenant je les change en somme (N1, N2, N): -sum1 (N1, N2, N, 0, [0,1,2,3,4,5,6,7,8,9], _) .', base de cas 'sum1 ([], [], [], 0, Chiffres, Chiffres) .' – stonestrong

+0

Vous avez raison. Je pense qu'il pourrait être contraint * après * toutes les étapes récursives, mais semble être inutile au but. – CapelliC