Пролог: простые решения для вывода программ - PullRequest
0 голосов
/ 05 января 2011

У меня есть предикат, принимающий единственный аргумент.Когда есть решение, этот единственный аргумент должен совпадать с другим моим аргументом (у меня есть предикат, который переходит от одного аргумента к трем).

Я могу легко напечатать решение, чтобы увидеть, что алгоритм работает.Тем не менее, я просто получаю 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 ).

ОБНОВЛЕНИЕ: Эта проблема является одной из '99 проблем Пролога' по адресу: http://sites.google.com/site/prologsite/prolog-problems/2, и это вопрос 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 Ответ

1 голос
/ 05 января 2011

Ответ false / no является результатом вызова M is Inter, который пытается установить равенство между номером Inter и входным номером M.Поскольку φ ( n ) никогда не равно n , за исключением случаев, когда n = 1, это почти всегда дает сбой.

Возможно, вы намеревалисьприсвойте значение Inter M, но это невозможно, потому что M всегда связан.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...