#pragma once

#ifndef PLA_operationsH
#define PLA_operationsH

class PLA;

class PLA_op {

	public:
		PLA_op() {};
		~PLA_op() {};

		PLA *JoinPLAsByInputs( PLA &pla1, PLA &pla2 ); // joins two PLAs. Input matrices are merged, the resulting output matrix is extended. New PLA is generated

		PLA *TermSharp( const Term& t1, const Term& t2 );		// returns t1 # t2
		SoPLA *TermSharp( const Cube& t1, const Cube& t2 ); // returns t1 # t2
		PLA *PLATermSharp( PLA &pla, const Term &t );				// returns PLA obtained as pla # t. New PLA is generated
		SoPLA *PLATermSharp( SoPLA &pla, const Cube &t );
		PLA *PLASharp( PLA &pla1, PLA &pla2 );			// Returns PLA obtained as pla1 # pla2. New PLA is generated
		SoPLA *PLASharp( SoPLA &pla1, SoPLA &pla2 );

		PLA *PLAComplement( PLA &pla );		//	Returns a complement of a PLA, computed by Sharp
		SoPLA *PLAComplement( SoPLA &pla );

		SoPLA *Cofactor( SoPLA &pla, const Cube &t );
};

#endif
