Предикат, дающий выходную мощность, отличную от предполагаемой - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть предикат под названием stop_when_equal, который работает следующим образом:

stop_when_equal(L1, L2):-
    Pred1(L1, L2),L1==L2, ! ;
    Pred1(L1, L2),stop_when_equal(L2,_).

В основном он продолжает применять Pred1 к L1 до тех пор, пока не будут внесены изменения. Если я использую writeln() здесь, то:

stop_when_equal(L1, L2):-
    Pred1(L1, L2),L1==L2,writeln(L2), ! ;
    Pred1(L1, L2),stop_when_equal(L2,_).

Он пишет, что предназначено, но вывод получается по-другому! Я знаю, что Pred1 работает правильно, так как, если я применяю его снова и снова, это в конечном итоге дает мне правильный вывод, но мне нужен предикат, который выполняет эту задачу для меня. В чем ошибка в моем коде?

1 Ответ

1 голос
/ 30 апреля 2020

Фу, я должен убедиться, что в скобках указано правильно.

?- write_canonical( ( stop_when_equal(L1, L2):- pred1(L1, L2),L1==L2, ! ; pred1(L1, L2),stop_when_equal(L2,_) ) ).

:-(stop_when_equal(A,B),;(','(pred1(A,B),','(==(A,B),!)),','(pred1(A,B),stop_when_equal(B,_))))

Ладно.

Можете ли вы добавить объяснение о том, что «результат получается по-другому»?

Попытка:

% https://en.wikipedia.org/wiki/Methods_of_computing_square_roots
pred1(L1,L2) :- L2 is 0.5 * (L1 + 2.0 / L1). 

stop_when_equal(L1, L2):-
    (pred1(L1, L2),
     debug(swe,"L1=~q, L2=~q",[L1,L2]),
     L1==L2, !) % what happens if this branch backtracks over pred1(L1,L2)??
    ;               
    (debug(swe,"Recursion",[]),
     pred1(L1, L2),
     stop_when_equal(L2,_)). % Doing nothing with he result?

У меня работает

?- debug(swe),stop_when_equal(0.5,L).
% L1=0.5, L2=2.25
% Recursion
% L1=2.25, L2=1.5694444444444444
% Recursion
% L1=1.5694444444444444, L2=1.4218903638151426
% Recursion
% L1=1.4218903638151426, L2=1.4142342859400734
% Recursion
% L1=1.4142342859400734, L2=1.4142135625249321
% Recursion
% L1=1.4142135625249321, L2=1.414213562373095
% Recursion
% L1=1.414213562373095, L2=1.414213562373095
L = 2.25.

Кажется, работает.

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