Prolog:简单的程序输出解决方案

时间:2011-01-05 12:11:24

标签: prolog

我有一个谓词只有一个参数。当有一个解决方案时,这个单个参数应该等于我的其他参数(我有一个从一个参数到三个的谓词)。

我可以轻松打印解决方案,看看算法是否有效。但是,我只是在程序运行时得到false / no。我认为这与我给程序一个变量并要求它返回相同的变量但由程序的执行所改变有关。我以前从未遇到过这种情况。

任何想法的人?

如果有人对整个代码提出任何建议,那么我也欢迎对此提出意见。

非常感谢新年快乐:)。

% 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 ).

更新:此问题是'http://sites.google.com/site/prologsite/prolog-problems/2中'99 Prolog问题'之一,问题是2.09。

更新:coprime / 2谓词被要求:

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

使用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 ).

1 个答案:

答案 0 :(得分:1)

false / no来自调用M is Inter的答案,该调用尝试在总计Inter和输入数M之间建立相等。由于φ( n )永远不等于 n ,除非 n = 1时,这几乎总是失败。

您可能打算将Inter的值分配给M,但这是不可能的,因为M始终是绑定的。