Переменная пролога не существует

Вот моя простая программа для проверки, если еще и вызов функции в swi пролог. Что не так с кодом ниже, который говорит rule не существует

call_rule(Roll):-
(
    member(Roll,[123]),
    writeln('inside call rule'),
    nb_getval(rule, 'this is the rule')
).
print_roll(Roll) :-
    (   Roll < 2 ->
        writeln('not a roll')
    ;
        (  Roll > 1243 ->
           writeln('not a roll'),writeln('this is 2nd alternative'),writeln('this is third alternative')
        ;
           ( Roll =:= 12 ->
                writeln('boxcars')
            ;
                ( call_rule(Roll) ->
                    nb_getval(rule, RULE),
            writeln('snake eyes')
                ;
                    nb_getval(rule,SUBJECT),
            writeln(SUBJECT)    
                )
            )
        )
    ).

результат:

3 ?- print_roll(123).  
inside call rule
ERROR: nb_getval/2: variable `rule' does not exist

1 ответ

Решение

Прежде чем вы сможете получить значение из магазина без возможности возврата назад, вам необходимо nb_setval ключ:

Пример:

?- nb_getval(a,X).
ERROR: nb_getval/2: variable `a' does not exist
?- nb_setval(a,foo).
true.

?- nb_getval(a,X).
X = foo.
Другие вопросы по тегам