2009-12-20 39 views
1

Existe-t-il un moyen de redéfinir récursivement (ne pas connaître le terme technique) les prédicats prolog?Prolog: redéfinition de la fonction récursive

Tenir compte de ces prédicats:

f(X,Y,A):-A is Y xor X. 
arity(f,2). 

maintenant je veux créer automatiquement 2 nouveaux prédicats f1/2 et f2/1 avec la définition suivante:

f1(Y,A):-f(1,Y,A). 
f2(A):-f1(1,A). 

Ainsi, le prédicat devrait obtenir un (binaire) fonctionnent en entrée et créent de nouveaux prédicats en remplissant les paramètres de la fonction (# définis par l'arité) de gauche à droite avec 1.

Est-ce possible? J'ai essayé différentes combinaisons de l'opérateur univ et appel() mais rien n'a réussi.

Est-ce que quelqu'un sait comment faire cela? Toute aide serait vraiment appréciée.

Edit: Un exemple pour un arité supérieur:

f(W,X,Y,Z,A):-A is Y xor X xor W xor Z. 
arity(f,4). 

->

f1(X,Y,Z,A):-f(1,X,Y,Z,A). 
f2(Y,Z,A):-f1(1,Y,Z,A). 
f3(Z,A):-f2(1,Z,A). 
f4(A):-f3(1,A). 

Depuis que je suis seulement interressés la valeur de retour de f (A) avec tous les paramètres mettre à 1 il pourrait y avoir un moyen plus facile de le faire ... En tout cas, merci pour votre aide!

+0

Je suis un peu confus par ce que vous recherchez. Pouvez-vous donner un exemple d'une plus grande arité? En outre, voulez-vous que les nouveaux prédicats soient ajoutés à la base de données prolog pour une utilisation immédiate, ou voulez-vous simplement les écrire dans un fichier texte? – nedned

Répondre

3

Jetez un oeil à term_expansion/2, il peut modifier le programme de manière arbitraire lorsqu'il est lu par le compilateur. Bien que soyez prudent, c'est une fonctionnalité puissante et vous pouvez facilement faire un grand désordre confus.

0

Je comprends pas bien votre question, mais peut-être cela pourrait être utile:

t :- 
    assert(my_add(A,B,C):-C is A+B), 
    my_add(1,2,R), 
    writeln(R). 

test:

?- t. 
3 
true.