我想使用assert
因为在Prolog中我们无法使用is
将值分配给变量两次。那我该怎么办呢?以下是我想要实现的内容 - 如何在该代码中添加assert
?
main:-
X1 is 3,
X2 is 3,
A is 1,
( X1=X2 -> A is 2 , write(A)
; X1=X3 -> A is 3 , write(A)
).
我想在if子句中更新A的值。如何使用assert
来完成?
答案 0 :(得分:0)
只需在A
构造之前让if-then
成为未绑定,如下所示:
main :-
X1 is 3,
X2 is 3,
( X1=X2 -> A is 2
; X1=X3 -> A is 3
),
write(A).
编辑:
OP(noobcoder)无论如何都想使用assert
。如果A
代表一个全局变量,那么就是这样的。
assert
用于捕获数据库中的新事实。如果您要更新这些事实,您可能还需要retract
旧值。例如:
main :-
X1 is 3,
X2 is 3,
( X1=X2 -> retractall(val_of_a(_)), assert(val_of_a(2))
; X1=X3 -> retractall(val_of_a(_)), assert(val_of_a(3))
),
val_of_a(A),
write(A).
答案 1 :(得分:0)
您需要注意的几件事情:
您不必两次使用retractall()
。您可以在main/0
:
main:-retractall(value_A(_)),
X1 is 3,X2 is 3,A is 1,
( X1=X2 -> asserta(value_A(2))
; X1=X3 -> asserta(value_A(3))
),value_A(X),write(X).
此外,assert
不是Prolog ISO;它不适用于Prolog的所有版本。最好使用asserta
。
此外,您可能需要在Prolog中声明动态变量。您可以在程序的顶部执行此操作,例如:
:- dynamic value_A/1.
main:-retractall(value_A(_)),
X1 is 3,X2 is 3,A is 1,
( X1=X2 -> asserta(value_A(2))
; X1=X3 -> asserta(value_A(3))
),value_A(X),write(X).
当您在Prolog程序的源代码中看到:-something
之类的内容时,这意味着这将在程序启动时执行。