#ifndef _COMBINATORIAL_LOGIC_EXPRESSION_H
#define _COMBINATORIAL_LOGIC_EXPRESSION_H

#include <vector>
#include <memory>
#include <user/logic.h>
#include <mentalEntity.h>
#include <concept.h>
#include <user/stimFrame.h>

namespace smo {
namespace cologex {

class Comparator
:	public MentalEntity, public logic::Operand
{
public:
	/**		EXPLANATION:
	 * The reference for a Comparator is the fixed mentity or range of mentities
	 * that this comparator is intended to validate a match against.
	 *
	 * There are several mentities against which a comparator can match. At the
	 * time of writing, we're fairly sure that these will be at minimum,
	 * qualia, chronomena and mentena.
	 */
	std::shared_ptr<MentalEntity> reference;
};

class ComparatorExpression
:	public logic::UnaryExpression
{
public:
	ComparatorExpression(
		logic::Operator &op, std::shared_ptr<Comparator> &comparator
	)
	:	logic::UnaryExpression(
			op, std::static_pointer_cast<logic::Operand>(comparator))
	{}
};

class CombinatorialLogicExpression
:	public MentalEntity, public logic::Expression, public Concept
{
public:

};

class CombinatorialLogicExpressionSeq
:	public MentalEntity, public Concept
{
public:
	std::vector<
		std::pair<stim_buff::SimultaneityStamp, CombinatorialLogicExpression>
	> expressions;
};

typedef CombinatorialLogicExpression Cologex;
typedef CombinatorialLogicExpressionSeq CologexSeq;

} // namespace cologex
} // namespace smo

#endif
