Prolog - 分配值而不是评估它

Prolog - Assign value instead of evaluating it

我是 Prolog 的新手,如果这很简单,我深表歉意,但它让我感到困惑。假设我有:

setFlag(Value, Flag) :-
    Value =\= 1.
setFlag(Value, Flag) :-
    Value =:= 1,
    Flag is true.  

现在,在获得这些结果后,我想检查标志 is/isn 是否为 1。我觉得最好的方法是:

CheckFlag(UnrelatedInput1, UnlrelatedInput2) :-
    setFlag(Value, Flag),
    Flag =:= true.

我面临的问题是,当我在上面说类似 Flag is true. 的内容时,Prolog 正在检查 Flag 是否真的为真,(这显然不是因为我传入0 代表标志,因为我不希望它本身就是真的)。那么,我如何要求 Prolog 在顶部函数上设置 Flag = true,以便我可以在下面检查它。另外,对我来说,说 Flag is true. 和说 Flag =:= true. 几乎是一样的,这对吗?

谢谢

您可以使用预定义谓词setarg/3。例如:

?- Term = tuple(10,20,30), setarg(1, Term, 90).
Term = tuple(90, 20, 30).

因此,一个可能的解决方案是将标志表示为 flag(Value) 形式的术语,并定义 setFlag/2 如下:

setFlag(Flag, Value) :-
    setarg(1, Flag, Value).

这里有一些例子:

?- MyFlag = flag(10), setFlag(MyFlag,20).
MyFlag = flag(20).

?- MyFlag = flag(false), setFlag(MyFlag,true).
MyFlag = flag(true).

?- MyFlag = flag(true), setFlag(MyFlag,false).
MyFlag = flag(false).

?- MyFlag = flag(false), setFlag(MyFlag,true), MyFlag = flag(true).
MyFlag = flag(true).

?- MyFlag = flag(false), setFlag(MyFlag,true), MyFlag = flag(false).
false.