Skip to content

GitLab

  • Projects
  • Groups
  • Snippets
  • Help
    • Loading...
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in
M MTSA
  • Project overview
    • Project overview
    • Details
    • Activity
    • Releases
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
  • Issues 68
    • Issues 68
    • List
    • Boards
    • Labels
    • Service Desk
    • Milestones
  • Merge requests 0
    • Merge requests 0
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Operations
    • Operations
    • Metrics
    • Incidents
    • Environments
  • Packages & Registries
    • Packages & Registries
    • Package Registry
  • Analytics
    • Analytics
    • CI/CD
    • Repository
    • Value Stream
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Members
    • Members
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • lafhis
  • MTSA
  • Issues
  • #65

Closed
Open
Created May 26, 2025 by Pablo Laciana@placianaOwner

Parser error for liveness parametrized goals in synthesis.

MSTA allows parameterized assertions:

fluent FL[j:1..5] = <msg[j],ack>

assert Prop(Id=1) = ([]<>FL[Id])

But the syntax for livenes goals in synthesis fails when they are used.

See example below:

const M = 2 //Number of locations per room

const N = 3 //Number of rooms

range Rooms = 1..N 

range Locations = 1..M

set Controllables = {go[Rooms][0..M],sense}

set Alphabet = {arrived[Rooms][0..M],yes.person,no.person}

‌

Room(Id=1) = Elem[0],

Elem[i:Locations] = (when (i<M) go[Id][i+1] -> arrived[Id][i+1] -> Elem[i+1] |

    when (i>0) go[Id][i-1] -> arrived[Id][i-1] -> Elem[i-1]).

‌

MovementModel = (go[Rooms][Locations] -> GoModel),

GoModel = (arrived[Rooms][Locations] -> MovementModel).

‌

Adjacency = InRoom1, //Start in room 0

InRoom1 = (go[1][Locations] -> InRoom1 | go[2][Locations] -> InRoom2), //From Room1 we can go to Room1 or Room2

InRoom2 = (go[2][Locations] -> InRoom2 | go[3][Locations] -> InRoom3), //From Room2 we can go to Room2 or Room3

InRoom3 = (go[3][Locations] -> InRoom3 | go[1][Locations] -> InRoom1). //From Room3 we can go to Room3 or Room1 

PersonSensor = (sense -> Sensing),

Sensing = ({yes.person,no.person} -> PersonSensor).

ltl_property SenseAtEachLoc = [](arrived[Rooms][Locations] -> (!go[Rooms][Locations] W {yes.person,no.person}))

||Environment = (forall[id:Rooms] Room(id) || MovementModel || Adjacency || PersonSensor || SenseAtEachLoc).

fluent WentLocRoom[j:1..N][i:0..M] = <arrived[j][i],yes.person>

fluent FoundPerson = <yes.person,Alphabet\{yes.person}>

assert VisitedRoom1 = ((WentLocRoom[1][0] && WentLocRoom[1][1] && WentLocRoom[1][2]) || FoundPerson)

assert VisitedRoom2 = ((WentLocRoom[2][0] && WentLocRoom[2][1] && WentLocRoom[2][2]) || FoundPerson)

assert VisitedRoom(Id=1) = ((forall[l:Locations] WentLocRoom[Id][l]) || FoundPerson)

controllerSpec ControlSpec = {

safety = {}

        assumption = {}

        liveness = {VisitedRoom(1),VisitedRoom(2)}

        controllable = {Controllables}

}

controller ||Controller = Environment~{ControlSpec}.

Assignee
Assign to
None
Milestone
None
Assign milestone
Time tracking