input: Write a python function to tokenize, clean, stem, and lemmatize a given text using NLTK.
  assert process_text('The brown bear walked in the woods, searching for a nut to snack on.') == ['brown', 'bear', 'walk', 'wood', 'search', 'nut', 'snack']
  assert process_text('I have a pen. She has a pencil.') == ['pen', 'pencil']
  assert process_text('Birds are flying high in the sky!') == ['bird', 'fli', 'high', 'sky']
output: import nltk
  from nltk.tokenize import word_tokenize
  from nltk.corpus import stopwords
  from nltk.stem import PorterStemmer, WordNetLemmatizer
  import string
  
  # Ensure necessary NLTK packages are downloaded
  nltk.download('punkt')
  nltk.download('stopwords')
  nltk.download('wordnet')
  
  def process_text(text):
      # Tokenize the text
      tokens = word_tokenize(text.lower())
      
      # Remove punctuation
      tokens = [word for word in tokens if word.isalnum()]
      
      # Remove stopwords
      stop_words = set(stopwords.words('english'))
      tokens = [word for word in tokens if word not in stop_words]
      
      # Stem and Lemmatize
      stemmer = PorterStemmer()
      lemmatizer = WordNetLemmatizer()
      tokens = [stemmer.stem(lemmatizer.lemmatize(word)) for word in tokens]
      
      return tokens