(Следующий вопрос касается языка OCaml и содержит примеры на OCaml, но вопрос очень общий, и, вероятно, правильный ответ для любого другого компьютерного языка также решит мою проблему. Итак, просто примите этот вопрос на вашем любимом языке. )
Я хочу написать функцию, которая принимает произвольную программу в OCaml как строку и решает, является ли программа правильной или неправильной, и, в последнем случае, могу ли я превратить ее в правильную, объединяя соответствующие символы в конце.
Я предполагаю, что где-то есть компилятор языка и что я могу применить его и получить ответ, говорящий либо «Компилируется», либо «Не компилируется - ошибка в строке X, символ Y» (как и во всяком случае, с большинством языков). Таким образом, я хотел бы иметь функцию, которая принимает программу и возвращает:
- Исправить - если строка содержит правильную программу;
- Ошибочно - если строка содержит неверную программу, которая, независимо от того, как вы ее объедините, никогда не станет правильной;
- Неполный - если строка содержит неверную программу, которая не является ошибочной.
Например, программа OCaml let x = f
неверна, поскольку f
не была определена ко времени ее использования. И это не может быть продолжено, потому что все, что вы пишете после f, всегда будет идентификатором, который не был определен ранее. Программа let x =
также неверна; но если мы расширим let x = 5
, тогда у нас будет совершенно корректная программа. Итак, моя функция должна возвращать Erroneous в первом случае и Incomplete во втором.
Все может стать сложнее, если у нас есть программа
let ans = 5
let x = a
потому что моя функция должна видеть, что если я продолжу программу с ns
, тогда программа станет правильной.
Мой вопрос : как вы думаете, возможно ли написать такую функцию / алгоритм? Если так, какова общая идея? Если нет, попробуйте убедить меня, что это не так.
(Я буду рад любым выводам или частичным ответам, например, тем, что подразумевает «Неполный». Например, я считаю, что если языковой компилятор говорит об ошибке в строке 3, а программа имеет 100 строк, то есть невозможно продолжение программы.)