Сообщение: 1031 Арифметическое переполнение в прологе - PullRequest
0 голосов
/ 02 декабря 2018

предикаты

nondeterm s(integer,integer)  
nondeterm p(integer,integer,integer)  

пункты

s(V,R) :-
    p(0,V,R).

%,write(R),nl.

p(R,0,R).

p(Inc,V,R) :-
    I2=Inc+V,
    N1=V-1,
    p(I2,N1,R).

цель

s(9,O).

дает арифметическое переполнение ,, почему ??

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

В дополнение к ответу Гая, полезно выполнить ваш запрос в трассировке Prolog, поскольку он ясно показывает, что, поскольку вы использовали унификацию (=/2) вместо оценки арифметических выражений (is/2), ваш запрос создает все больший размерсоставной член при каждом рекурсивном вызове до исчерпания пространства глобального стека:

[trace]  ?- s(9,O).
   Call: (8) s(9, _3176) ? creep
   Call: (9) p(0, 9, _3176) ? creep
   Call: (10) _3396=0+9 ? creep
   Exit: (10) 0+9=0+9 ? creep
   Call: (10) _3402=9-1 ? creep
   Exit: (10) 9-1=9-1 ? creep
   Call: (10) p(0+9, 9-1, _3176) ? creep
   Call: (11) _3408=0+9+(9-1) ? creep
   Exit: (11) 0+9+(9-1)=0+9+(9-1) ? creep
   Call: (11) _3414=9-1-1 ? creep
   Exit: (11) 9-1-1=9-1-1 ? creep
   Call: (11) p(0+9+(9-1), 9-1-1, _3176) ? creep
   Call: (12) _3420=0+9+(9-1)+(9-1-1) ? creep
   Exit: (12) 0+9+(9-1)+(9-1-1)=0+9+(9-1)+(9-1-1) ? creep
   Call: (12) _3426=9-1-1-1 ?
   ...
0 голосов
/ 02 декабря 2018

В Прологе математические выражения не выполняются с присваиванием, например =.Prolog не использует присваивания, как многие распространенные языки программирования, Prolog использует унификацию.Если вы хотите выполнять математические выражения в Прологе и объединять результат с переменной, вам необходимо использовать оператор is / 2

I2 is Inc+V
N1 is V-1

. Вам также понадобится оператор guard, чтобы не выполнять второе предложение, есливторой параметр равен 0.

s(V,O) :-
    p(0,V,O).

p(R,0,R).

p(Inc,V,R) :-
    V \= 0,
    I2 is Inc+V,
    N1 is V-1,
    p(I2,N1,R).

Теперь ваш запрос возвращает

?- s(9,O).
O = 45 ;
false.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...