<think>
Okay, I need to implement the two functions, match_at and grid_find, as per the given interface. Let me start by understanding what each function is supposed to do.

First, the match_at function. The description says it checks if the cell at a specific row and column in the grid holds a given value. So, the parameters are grid, row, column, and value. The function should return a boolean. But wait, the grid is a list of lists, right? So each row in the grid is a list of values. So to access the cell at (row, column), I need to get grid[row][column], and check if it equals the value. But wait, the parameters are row and column. But in Python, lists are zero-indexed, so that's straightforward. But I need to make sure that the row and column are within the bounds of the grid. However, the problem says that the functions should reject a grid not holding the value anywhere with an error. But for match_at, maybe the function doesn't need to check if the row and column are valid? Or does it? Wait, the problem says that the functions should reject a grid not holding the value anywhere with an error. But for match_at, maybe the function is just checking a specific cell, so if the row or column is out of bounds, that's a valid error? Or is that considered an invalid argument? The problem says that the function should reject a grid not holding the value anywhere with an error. But for match_at, the function is just checking a specific cell. So maybe the function doesn't need to check if the row and column are valid. But the problem says that the functions should reject a grid not holding the value anywhere with an error. Wait, but the error is for when the grid doesn't have the value anywhere. But for match_at, the function is just checking a specific cell. So maybe the function doesn't need to check if the row and column are valid. But the problem says that the function should reject a grid not holding the value anywhere with an error. Wait, but that's for grid_find. So for match_at, maybe the function is just checking a specific cell, and if that cell is out of bounds, that's an error. But the problem says that the functions should reject a grid not holding the value anywhere with an error. But that's for grid_find. So perhaps the match_at function is allowed to have invalid row and column indices, but the problem says that the function should not raise an error unless the grid doesn't have the value. Wait, the problem says that grid_find should reject a grid not holding the value anywhere with an error. But for match_at, the function is just checking a specific cell. So maybe the function doesn't need to check if the row and column are valid. But the problem says that the function should not raise an error unless the grid doesn't have the value. Wait, but the function is supposed to check if the cell at row and column has the value. So if the row or column is out of bounds, that's an invalid index, which would be a ValueError. But the problem says that the function should not raise an error unless the grid doesn't have the value. Wait, maybe the problem is that the function is supposed to check if the cell exists. But the problem says that the functions should reject a grid not holding the value anywhere with an error. But for match_at, the function is not checking if the grid has the value, but if a specific cell has the value. So perhaps the function is allowed to have invalid indices, but the problem says that the function should not raise an error unless the grid doesn't have the value. Wait, maybe the