prolog - 在序言中收回和断言值
问题描述
我一直在 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 谓词。但它没有按预期工作。我希望有人有一个想法。
解决方案
推荐阅读
- java - 谷歌recaptcha检测到Selenium java没有得到核心
- python - 如何自己比较(域)many2many 字段的值?
- c++ - 集群仅使用 MPI 运行 7 个或更少的任务
- javascript - 摩卡测试 - 解决 assertion_error
- python - 如何通过重复列表将熊猫数据框的行(而不是列)划分?
- c++ - 如何打印数组的最小数量及其使用函数调用它们的索引?
- cakephp - Configure::read 和控制器全局变量在 cakephp 2.10.12 中不起作用
- c# - 如何在一个 NUnit 项目中正确测试弱/强命名的内部类?
- laravel - 在laravel的select标签中选择供应商名称时如何显示其他数据
- ios - 文件提供程序扩展的显示名称