首页 > 解决方案 > 在序言中收回和断言值

问题描述

我一直在 prolog 中对一些指令图进行建模。它由节点和边以及它们的连接方式组成。每个节点都有一定的冲浪者价值(页面排名)。例如

e(a,c).
e(b,a).
e(b,h).

:-dynamic s/2.
s(a,1).
s(b,1).
s(c,1).

我写了一个解释器。该解释器为每个节点计算新值。问题是如何将这些新值分配给数据库。我一直在使用retractall(s( , )) 并使用例如assertz(s(a,sum0), assertz(s(b,sum1), ...) 为每个节点断言新值。这一直有效,但是是否可以在不为图中的每个特定节点断言值的情况下断言新值,从而使解释器完全独立于图?我一直在尝试生成一个包含图中所有节点的列表并指示 a 的节点此列表中的图表。

sum_nodes_0(X,Y):-
list_nodes(_,L),
amount_nodes(N),
nth1(I,L,X),I=<N,sum_node(X,Y).

reset(X,S):-
list_nodes(_,L),
s(X,S),
sum_node(X,Y),
retractall(s(_,_)),
forall(member(X,L),assertz(s(X,Y))).

sum_nodes_0 向我显示新值,例如。

X = a,
Y = 1.0 ;
X = b,
Y = 1 ;
X = c,
Y = 2 ;
X = d,
Y = 0.5 ;
X = e,
Y = 1.5 ;
X = f,
Y = 0.5 ;
X = g,
Y = 1 ;
X = h,
Y = 0.5.

我想通过重置(X,S)分配这些值。但是重置只是重置一个值而不是全部。例如 X=h;Y=0

我尝试过 foreach、forall 和 member 谓词。但它没有按预期工作。我希望有人有一个想法。

标签: prologassert

解决方案


推荐阅读