2011-01-05 3 views
0

J'ai un prédicat prenant un seul argument. Quand il y a une solution, cet argument unique doit être égal à un autre argument que j'ai (j'ai un prédicat qui va d'un argument à trois).Prolog: solutions de sortie de programme simples

Je peux imprimer la solution facilement pour voir que l'algorithme fonctionne. Cependant, je viens d'obtenir false/no lorsque le programme s'exécute. Je pense que c'est quelque chose à voir avec moi donnant au programme une variable et lui demandant de retourner la même variable mais modifiée par l'exécution du programme. Je n'ai jamais eu cette situation auparavant.

Des idées les gars?

Si quelqu'un comme des suggestions sur le code dans son ensemble, alors je serais heureux de recevoir des commentaires à ce sujet aussi.

Merci beaucoup et bonne année :).

% Eulers totient function 
phi(M) :- 
    phi(0, 0, M).  
phi(Count, Inter, M) :- 
    Count = M, 
    print(Inter), 
    M is Inter. 
phi(Count, Inter, M) :- 
    Count \= M, 
    coprime(Count, M), 
    InterNew is Inter + 1, 
    CountNew is Count + 1, 
    phi(CountNew, InterNew, M). 
phi(Count, Inter, M) :- 
    Count \= M, 
    \+ coprime(Count, M), 
    CountNew is Count + 1, 
    phi(CountNew, Inter, M). 

MISE À JOUR: Ce problème est l'un des problèmes Prolog '99 à: http://sites.google.com/site/prologsite/prolog-problems/2 et il est question 2.09.

MISE À JOUR: coprime/2-jacente a été demandé:

% coprime is defined as two integers having a gcd of 1 
coprime(X, Y) :- 
    gcd(X, Y, 1). 

qui utilise prédicat GCD:

% calculating the greatest common divisor of two numbers 
% recursive version of Euclidian algorithm 
gcd(G, 0, G). 
gcd(Lo, Hi, G) :- 
    Hi \= 0, 
    Inter is Lo mod Hi, 
    gcd(Hi, Inter, G). 
+0

Pourriez-vous publier le prédicat coprime? –

+0

Quelle requête posez-vous? – ShiDoiSi

+0

Que doit faire 'phi/1'? La fonction de totaliseur d'Euler ne peut pas être implémentée comme un prédicat à un seul argument ... –

Répondre

1

Les false/no répondant à une question de l'appel M is Inter, qui tente d'établir l'égalité entre les le totient Inter et le numéro d'entrée M. Puisque φ (n) n'est jamais égal à n sauf lorsque n = 1, cela échoue presque toujours.

Vous avez peut-être l'intention d'affecter la valeur Inter à M, mais cela est impossible car M est toujours lié.

Questions connexes