Может быть, вы хотите попробовать полуавтоматический метод доказательства. Просто чтобы перейти к чему-то другому;) Например, если у вас есть Java-спецификация алгоритмов Прима и Крускала, оптимально основанная на той же графовой модели, вы можете использовать KeY Prover , чтобы доказать эквивалентность алгоритма .
Важнейшая часть - формализовать ваше обязательство по доказательству в динамической логике (это расширение логики первого порядка с типами и средствами символического исполнения Java-программ). Формула для доказательства может соответствовать следующей (схематичной) схеме:
\forall Graph g. \exists Tree t.
(<{KRUSKAL_CODE_HERE}>resultVar1=t) <-> (<{PRIM_CODE_HERE}>resultVar2=t)
Это выражает то, что для всех графиков оба алгоритма завершаются, и результатом является одно и то же дерево.
Если вам повезло и ваша формула (и реализации алгоритма) верны, то KeY может доказать это автоматически для вас. Если нет, вам может потребоваться создать экземпляр некоторых количественных переменных, что делает необходимым проверку предыдущего дерева доказательств.
После того, как вы доказали это с помощью KeY, вы можете либо порадоваться, узнав что-то, либо попытаться восстановить ручное доказательство из доказательства KeY - это может быть утомительным занятием, поскольку KeY знает множество правил, специфичных для Java, которые не легко понять. Однако, возможно, вы можете сделать что-то вроде извлечения дизъюнкции Гербранда из терминов, которые KeY использовал для создания экзистенциальных квантификаторов в правой части последовательностей в доказательстве.
Ну, я думаю, что KeY - интересный инструмент, и больше людей должны привыкнуть доказывать критический код Java с помощью таких инструментов;)