ruslaniv
1/24/2019 - 5:42 AM

Petri net implementation for material implication inversion in C++

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;
}