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.
我是 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.