По построению, в так называемом стиле присвоения [используется в вашей модели]:
В качестве альтернативы можно использовать так называемый тип ограничения , который позволяет :
INIT
, которые не приводят к отсутствию начальных состояний TRANS
, которые приводят к состояниям взаимоблокировки (то есть состояние без какого-либо исходящего перехода в какое-то следующее состояние) Для получения дополнительной информации см. вторую часть этого курса , которая применяется также к NuSMV
по большей части.
Пример автомата, в котором у какого-либо состояния нет будущего состояния:
MODULE main
VAR b : boolean;
TRANS b -> FALSE;
Состояние, в котором b
равен true
, не имеет будущего состояния. И наоборот, состояние, в котором b
является false
, может само по себе зацикливаться или переходить в состояние, в котором b = true
.
Вы можете использовать команду check_fsm
для обнаружения тупиковых состояний.
Обратите внимание, что наличие взаимоблокировочных состояний может препятствовать правильности проверки модели в некоторых ситуациях. Например:
FAQ # 007: Спецификация CTL с квантификатором экзистенциального пути верхнего уровня ошибочно сообщается как нарушенная. Например, для модели, представленной ниже, обе спецификации указываются как ложные, хотя одна является просто отрицанием другой! Я знаю, что такие проблемы могут возникать с тупиковыми состояниями, но запуск его с -ctt говорит, что все в порядке.
blockquote>MODULE main VAR b : boolean; TRANS next(b) = b; CTLSPEC EF b CTLSPEC !(EF b)
О других критических последствиях тупиковых состояний в переходном соотношении см. на этой странице .
Обычно, когда
NuSMV
говорит, что «условия падежа не являются исчерпывающими» , добавляется действие по умолчанию с условиемTRUE
в концеcase
конструкция, которая срабатывает, когда не применяется ни одно из предыдущих условий. Наиболее распространенным выбором для действия по умолчанию является автопетля , которая кодируется следующим образом:MODULE main VAR location: {l1,l2,l3}; ASSIGN init(location):= l1; next(location):= case (location = l1): l2; (location = l2): {l1, l3}; TRUE : location; esac;
ПРИМЕЧАНИЕ: пожалуйста обратите внимание, что если существует несколько условий с одинаковым защитным устройством , только первое из этих условий когда-либо используется. По этой причине, когда в вашей модели
location = l2
следующее значениеlocation
может быть толькоl1
и никогдаl3
. Чтобы исправить это и иметь некоторый недетерминированный выбор средиl1
иl3
, необходимо перечислить все возможные будущие значения при том же условии, что и набор значений (то есть{l1, l3}
).
Это можно сделать, вызвав метод Win32 API GetKeyboardLayoutName (). Клавиатуры Дворжака имеют определенные имена. Например, макет Дворжака в США имеет имя 00010409.
Фрагмент кода:
public class Program
{
const int KL_NAMELENGTH = 9;
[DllImport("user32.dll")]
private static extern long GetKeyboardLayoutName(
System.Text.StringBuilder pwszKLID);
static void Main(string[] args)
{
StringBuilder name = new StringBuilder(KL_NAMELENGTH);
GetKeyboardLayoutName(name);
Console.WriteLine(name);
}
}
, что, вероятно, зависит от ОС. Я уверен, что где-то есть настройка операционной системы, которая регистрирует национальность клавиатуры. (Дворак считается национальностью, потому что французские клавиатуры отличаются от клавиатур в США, от ...)
Кроме того, небольшое примечание: «A» был плохим примером, поскольку «A» - это та же самая клавиша в dvorak и qwerty ... B -)
Возможно, вы сможете сделать это через DirectInput или какой-либо другой эквивалент DirectX. Я печатаю на клавиатуре Дворжака, и около 50% игр, которые я покупаю, обнаруживают мою клавиатуру и перенастраивают раскладки клавиатуры по умолчанию, чтобы поддерживать ее (например, используя, aoe вместо wasd)
И да, как сказал Брайан: «A 'одинаково на обеих клавиатурах.
Какое это имеет значение? Зависимость от какой-то специальной реализации клавиатуры - это вообще не лучшая идея. Мы повсюду используем сканеры штрих-кода, которые имитируют ввод с клавиатуры. Что ваша программа будет делать с этими устройствами? :)
PS: упомянутая запись в реестре упорядочивает клавиши обычной клавиатуры по дворак.