#include <string>
#include <iostream>
#include <time.h>
#include <assert.h>

string make_atomic_proposition()
{
  string atomic_proposition;

  // Generate a random number between 1 and 10
  int random_expression = 1 +  rand() % 4;

  switch (random_expression)
  {
    case 1:
      atomic_proposition = "First";
      break;
    case 2:
      atomic_proposition = "Second";
      break;
    case 3:
      atomic_proposition = "p";
      break;
    case 4:
      atomic_proposition = "q";
      break;
    default:
      assert("We should never reach here!");
  }

  return atomic_proposition;
}

string make_expression()
{
  string expression;

  // Generate a random number between 1 and 10
  int random_expression = 1 +  rand() % 12;

  switch (random_expression)
  {
    case 1:
      expression = make_expression() + " \\land " + make_expression();
      break;
    case 2:
      expression = make_expression() + " \\lor " + make_expression();
      break;
    case 3:
      expression = make_expression() + " \\implies " + make_expression();
      break;
    case 4:
      expression = make_expression() + " \\iff " + make_expression();
      break;
    // We make this case more likely in order to favor shorter expressions
    default:
      expression = make_atomic_proposition();
      break;
  }

  return expression;
}

int main()
{
  // Initialize the random number generator
  srand(time(NULL));

  cout << make_expression();

  return 0;
}
