Я публикую решение в виде отдельного ответа, надеясь, что другие пользователи могут извлечь из него пользу. Вот оно:
Theorem cancel : forall (i j k : nat),
((add i j) = (add i k)) -> (j = k).
Proof.
intros i j k H.
induction i.
apply H.
simpl in H.
apply eq_add_S in H.
apply IHi in H.
assumption.
Qed.
Если Вы не хотите соответствовать тире mutiple друг после друга:
^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$
Это будет соответствовать: a
, a-a
, aaa-a
, aaa-a-aaa-a-aaa-a
, и т.д.
Но нет: -
, -a
, a-
, a--a
, a-a-a-
, a-a--a
, и т.д.
Вот POSIX +, смотрят-akead вариант выполнения его:
^[[:alnum:]](?:[[:alnum:]-](?!-$))*$
Это также позволяет всего один символ как соответствие. Это не таким образом читаемо, все же.;-)
Отметьте это [[:alnum:]]
предопределенный класс символов стенографии, эквивалентный [a-zA-Z0-9]
, быть более эффективным, но в других отношениях взаимозаменяемым. Не каждая regex разновидность знает эти классы POSIX, используйте традиционную форму, если Вам нравится.
Вот тот, который не позволяет несколько последовательных дефисов, и это короче:
^(?:[[:alnum:]]+(?:-(?!$))?)+$
и это - форма неPOSIX:
^(?:[a-zA-Z0-9]+(?:-(?!$))?)+$
Я сделал бы предложение:
^[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?$
Это также соответствует строкам длины 1.