Я вже читав приклади формул у CTL, але не в LTL, і навпаки, але у мене виникають проблеми з розумовим розумінням формул LTL, і справді в чому полягає різниця.
Я вже читав приклади формул у CTL, але не в LTL, і навпаки, але у мене виникають проблеми з розумовим розумінням формул LTL, і справді в чому полягає різниця.
Відповіді:
Щоб реально зрозуміти різницю між LTL та CTL, ви повинні вивчити семантику обох мов. Формули LTL позначають властивості, які будуть інтерпретуватися при кожному виконанні програми. Для кожного можливого виконання (запуску), який можна розглядати як послідовність подій або станів на рядку - і саме тому його називають "лінійним часом" - задоволеність перевіряється на ходу без можливості переходу на інший пробіг під час перевірки. З іншого боку, CTL семантики перевіряє формулу на всі можливі траси і намагатимуться або всі можливі пробіги ( оператор) або тільки один прогін ( E оператор) , коли перед обличчям філії.
На практиці це означає, що деякі формули кожної мови не можна викласти іншою мовою. Наприклад, властивість скидання (важлива властивість доступності для проектування схеми) стверджує, що завжди існує можливість, що стан може бути досягнутий під час пробігу, навіть якщо він ніколи фактично не досягнутий ( AG EF reset ). LTL може констатувати лише те, що стан скидання фактично досягнуто, а не що його можна досягти.
З іншого боку, формула LTL не може бути переведена в CTL. Ця формула позначає властивість стабільності: у кожному виконанні програми s нарешті буде істинним до кінця програми (або назавжди, якщо програма ніколи не зупиняється). CTL може надати лише занадто сувору формулу ( AF AG s ) або занадто дозвільну ( AF EG s ). Другий явно неправильний. Це не так прямо для першого. Але AF AG s - це помилково. Розглянемо систему, що цикли на A1 , може перейти від A1 до B, а потім перейде до A2 на наступному кроці. Тоді система залишиться вСтан A2 назавжди. Тоді "система нарешті залишиться у стані A " - це властивість типу . Очевидно, що ця властивість зберігається в системі. Однак AF AG не може захопити цю властивість, оскільки це навпаки: є запуск, в якому система завжди буде знаходитись у стані, з якого, нарешті, пробіг переходить у не A стан.
Я не знаю, чи відповідає це на ваше запитання, але я хотів би додати кілька коментарів.
Існує багато обговорень найкращої логіки вираження властивостей для перевірки програмного забезпечення ... але справжня дискусія десь в іншому місці. LTL може виражати важливі властивості для моделювання програмних систем (справедливості), коли CTL повинен мати нову семантику (нове відношення задоволеності) для їх вираження. Але алгоритми CTL зазвичай більш ефективні і можуть використовувати алгоритми на основі BDD. Отже ... немає найкращого рішення. Поки що лише два різні підходи.
Один із коментаторів пропонує статтю Варді "Розгалуження проти лінійного часу: остаточний розбор" .
Якщо вам дають один об'єкт (наприклад, слід у випадку LTL), ви вважаєте лише одне майбутнє за кожний момент часу, у CTL ви маєте безліч їх.
Зокрема, next
дає унікальну дію в LTL, але (потенційно) цілий набір у CTL.