втягивание и утверждение значений в прологе - PullRequest
1 голос
/ 23 февраля 2020

Я моделировал некоторые директивные графы в прологе. Он состоит из узлов и ребер и того, как они связаны. Каждый узел имеет определенное значение серферов (рейтинг страницы). например,

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), ... Это работает, но возможно ли утверждать новые значения, не присваивая каждому конкретному узлу в графе значение, так что интерпретатор полностью независим от графа? Я пытался создать список со всеми узлами в графе. и указание узлов графика в этом списке.

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. Но это не сработало так, как задумано. Я надеюсь, что у кого-то есть идея.

...