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