Я начинаю изучать чистую логику и пролог с Ciao Prolog и тестирую небольшие программы для университета.
Проблема в том, что я не понимаю, почему в случае сбоя следует вернуться назад, а не переходить к следующему предикату.
Вот мой код:
% numeroOriginal/3
numeroOriginal(',',_,_).
% numeroRedondeado/3
numeroRedondeado(',',_,_).
% redondeo/3
redondeado(_,numeroOriginal(',',_,_),numeroRedondeado(',',_,_)).
% redondearDecimal/3
% redondeo a las unidades -----------------------------------------------------------
% truncamiento
redondearDecimal(X,redondeoUnidad,redondeo(redondeoUnidad,numeroOriginal(',',A,B),numeroRedondeado(',',A,Bm))):-
unidades(X,,U,[V|_]),
less(V,s(s(s(s(s(0)))))),
A=U,
B=[V],
Bm=[].
% suma a las unidades
redondearDecimal(X,redondeoUnidad,redondeo(redondeoUnidad,numeroOriginal(',',A,B),numeroRedondeado(',',Am,Bm))):-
unidades(X,_,U,[V|]),
reves(U,R),
suma1(R,_,Y),
reves(Y,Rs),
A=U,
B=[V],
Am=Rs,
Bm=[].
Моя проблема, когда я пытаюсь сделать это:
redondearDecimal([s(s(s(s(s(0))))),',',s(s(s(s(s(0)))))],redondeoUnidad,redondeo(redondeoUnidad, numeroOriginal(',',[s(s(s(s(s(0)))))],[s(s(s(s(s(0)))))]),numeroRedondeado(',', [s(s(s(s(s(s(0))))))], []))).
Этот успех, но если я изменю его на это:
redondearDecimal([s(s(s(s(s(0))))),',',s(s(s(s(s(0)))))],redondeoUnidad,redondeo(redondeoUnidad, numeroOriginal(',',[s(s(s(s(s(0)))))],[s(s(s(s(s(0)))))]),numeroRedondeado(',', A, B))).
У меня есть цикл, потому что он возвращается, когда достигает "less / 2".