номера N и NN, a именно NN=(N+1)mod5. Сложение по модулю 5
реализуется при помощи предиката mod5 cледующим образом:
mod5(X,XX):- X < 5,
XX is X + 1, !.
mod5(X,XX):- XX is 1.
Следует также заметить, что последнее предложение не эквивалентно
предложению с анонимной переменной,
mod5(_,XX):- XX is 1,
поскольку в последнем случае происходит расконкретизация переменной,
стоящей на первом месте в списке аргументов предиката mod5.
Предикат inlist(E,L) используется для определения принадлежности
элемента E списку L и определяется следующим образом:
inlist(X,[X|L]).
inlist(X,[Y|L]):-inlist(X,L).
Начальная маркировка сетевой модели определяется следующим
фактом:
init([think(1),think(2),think(3),think(4),think(5),
fork(1),fork(2),fork(3),fork(4),fork(5)]).
Следует отметить, что представленная сеть может моделировать
различные ситуации из различных проблемных областей.
Ниже представлены выходные данные, определяющие ГДС, полученные с
помощью клозов, определенных в разд. 1.4.
Достигнутые состояния (база данных rstate):
0 [think(1),think(2),think(3),think(4),think(5),fork(1),fork(2),
fork(3),fork(4),fork(5)]
1 [eat(1),think(2),think(3),think(4),think(5),fork(3),fork(4),fork(5)]
2 [eat(3),eat(1),think(2),think(4),think(5),fork(5)]
3 [think(1),fork(1),fork(2),eat(3),think(2),think(4),think(5),fork(5)]
4 [eat(5),think(1),fork(2),eat(3),think(2),think(4)]
5 [think(3),fork(3),fork(4),eat(5),think(1),fork(2),think(2),think(4)]
6 [eat(2),think(3),fork(4),eat(5),think(1),think(4)]
7 [think(5),fork(5),fork(1),eat(2),think(3),fork(4),think(1),think(4)]
8 [eat(4),think(5),fork(1),eat(2),think(3),think(1)]
9 [think(2),fork(2),fork(3),eat(4),think(5),fork(1),think(3),think(1)]
10 [eat(1),think(2),fork(3),eat(4),think(5),think(3)]
Дуги ГДС (база данных gds):
0 get(1) 1
1 get(3) 2
2 put(3) 1
5 get(3) 4
5 get(2) 6
6 put(2) 5
9 get(2) 8
9 get(1) 10
10 put(1) 9
1 get(4) 10
1 put(1) 0
0 get(2) 7