Petri net implementation for material implication inversion in C++
#include <windows.h>
#define _USE_MATH_DEFINES
#include <math.h>
#include <time.h>
#include <stdio.h>
#include <conio.h>
#include <locale>
#include <iostream>
#pragma warning (disable:4996)
// описание класса сети Петри
class PetriNet
{
private: // данные для сети
static int positions[9]; //кол-во мест
static int moves_out[6][9]; // Д- из места в переход
static int moves_in[6][9]; // Д+ из перехода в место
bool move(int m); // флаг для возможности перехода
public:
int Fire() // работа алгоритма
{
if (!move(0)) move(1);
if (!move(2)) move(3);
move(4);
move(5);
return positions[7] + (positions[8] << 1);
}
static void init_petri_net(int p11, int p12, int p21, int p22); // инициализация
};
int PetriNet::positions[9] = // маркировка сети
{ 0, 0, 0, 0, 1, 0, 0, 0, 0 };
int PetriNet::moves_out[6][9] = // сколько фишек забирать из места при запуске перехода
{ // 1 2 3 4 5 6 7 8 9
{ 0, 1, 0, 0, 1, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 1, 0, 0, 0, 0 },
{ 0, 0, 0, 1, 1, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 1, 0, 0, 0, 0 },
{ 1, 0, 0, 0, 0, 1, 0, 0, 0 },
{ 0, 0, 1, 0, 0, 0, 1, 0, 0 },
};
int PetriNet::moves_in[6][9] = // сколько фишек добавлять в место при запуске переходов
{ // 1 2 3 4 5 6 7 8 9
{ 0, 0, 0, 0, 1, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 1, 1, 0, 0, 0 },
{ 0, 0, 0, 0, 1, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 1, 0, 1, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 1, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 1 },
};
void PetriNet::init_petri_net(int p11, int p12, int p21, int p22) // инициализация заданными с клавиатуры данными
{
positions[0] = p11;
positions[1] = p12;
positions[2] = p21;
positions[3] = p22;
}
bool PetriNet::move(int m) // запуск перехода с номером m
{
for (int i = 0; i < 9; i++)
if (positions[i] < moves_out[m][i])
return false;
for (int i = 0; i < 9; i++)
positions[i] = positions[i] - moves_out[m][i] + moves_in[m][i]; //решаем матричное уравнение D=(D+ − D−)
return true;
}
using namespace std;
int main()
{
setlocale(LC_ALL, "RUS");
int p11, p12, p21, p22;
printf("Введите младший бит первого операнад (0, 1): ");
scanf("%d", &p11);
printf("Введите старший бит первого операнда (0, 1): ");
scanf("%d", &p21);
printf("Введите младший бит второго операнда (0, 1): ");
scanf("%d", &p12);
printf("Введите старший бит второго операнда (0, 1): ");
scanf("%d", &p22);
PetriNet klp;
klp.init_petri_net(p11, p12, p21, p22);
int rez = klp.Fire();
printf("Результат инверсии импликации (%d%d,%d%d) = %d%d\n", p11, p21, p12, p22, rez / 2, rez % 2);
printf("\n");
return 0;
}