我怎样才能在Prolog中使用assert

时间:2014-09-28 07:05:27

标签: prolog

我想使用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来完成?

2 个答案:

答案 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之类的内容时,这意味着这将在程序启动时执行。