Amzi Prolog 调用时不会传值

Amzi Prolog won't pass value when being called

/* MAIN PROGRAM */

main:- welcome.

welcome:-
    write('************************************************'),nl,
    write('*   Welcome to my Simple Calculator   *'),nl,
    write('************************************************'),nl,nl,
    write('For every input you enter, please followed by a full stop[.]'),
    numbers.

numbers:-
    nl,nl,write('First number: '),
    read(FIRST),nl,
    write('Second number: '),
    read(SECOND),nl,
    operation.

operation:-
    nl,write('[1]- Addition.'), nl,
    nl,write('[2]- Subtraction.'),nl,
    nl,write('[3]- Multiplication.'),nl,
    nl,write('[4]- Division.'),nl,
    nl,write('[5]- Exit.'),nl,
    nl,write(':>'),
    read(ANS1),nl,
    set_op(ANS1).

set_op(1):-
    write(FIRST),write(SECOND),
    SUM is FIRST + SECOND,
    write(SUM).

我在执行一个简单的计算器程序时遇到问题。由于某些原因,它在被调用时只会传递变量的地址而不是值。如果有人能指出我的失误,我将不胜感激。 谢谢。

Prolog 中的变量不是全局的。因此,set_op 中的 FIRSTSECOND 局部范围的 。因此,set_op/1 中的 FIRSTSECONDnumbers/0 谓词中的变量不同。

在声明式编程语言中,通常 function/predicate/... 的结果仅取决于传递的参数。尽管在 Prolog 中有一些方法可以将 "global state" 表示为不可回溯的存储,但通常认为应用该原则更好,因此不实现某种全局状态。

您需要传递变量,例如:

numbers :-
    nl,nl,write('First number: '),
    read(<b>First</b>),nl,
    write('Second number: '),
    read(<b>Second</b>),nl,
    operation(<b>First, Second</b>).

operation(<b>First, Second</b>) :-
    nl,write('[1]- Addition.'), nl,
    nl,write('[2]- Subtraction.'),nl,
    nl,write('[3]- Multiplication.'),nl,
    nl,write('[4]- Division.'),nl,
    nl,write('[5]- Exit.'),nl,
    nl,write(':>'),
    read(Op),nl,
    write(First), write(Second),
    set_op(Op, <b>First, Second</b>).

set_op(1<b>, First, Second</b>) :-
    Sum is First + Second,
    write(Sum).