{"id":22116330,"url":"https://github.com/jmid/iterated","last_synced_at":"2025-03-24T05:41:27.166Z","repository":{"id":82291539,"uuid":"63081185","full_name":"jmid/iterated","owner":"jmid","description":"An iterated process analysis over lattice-valued regular expressions","archived":false,"fork":false,"pushed_at":"2016-07-11T17:57:12.000Z","size":886,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-01-29T11:27:27.474Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jmid.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-07-11T15:48:15.000Z","updated_at":"2016-07-11T16:48:16.000Z","dependencies_parsed_at":null,"dependency_job_id":"38e0d03f-db27-4879-9984-34f969399806","html_url":"https://github.com/jmid/iterated","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jmid%2Fiterated","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jmid%2Fiterated/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jmid%2Fiterated/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jmid%2Fiterated/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jmid","download_url":"https://codeload.github.com/jmid/iterated/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245217791,"owners_count":20579297,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-12-01T12:26:57.491Z","updated_at":"2025-03-24T05:41:27.139Z","avatar_url":"https://github.com/jmid.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"This directory contains the prototype implementation of the static\nanalysis described in the paper\n\n    Iterated Process Analysis over Lattice-Valued Regular Expressions\n    Jan Midtgaard, Flemming Nielson, and Hanne Riis Nielson   \n    PPDP 2016\n\nThe prototype supports a slightly larger language than described in\nthe paper. In particular, the supported Boolean expressions are:\n\n    b ::= tt | ff | neg b | a0 = a1 | a0 \u003c a1 | a0 \u003c= a1\n\nThe supported statements of the core language is available in ast.ml\nas the type 'stmt'.\n\nA slightly extended statement language is available as 'exstmt' along\nwith a desugarer ('desugar_exstmt' and 'desugar_exblock') for\ntranslating the extended language back to the core language.\n\n\nTo run examples:\n----------------\n\nIt is easiest to try the examples through [the web-client](https://jmid.github.io/iterated/).\nTo do so, simply open [the link](https://jmid.github.io/iterated/) in a browser that supports JavaScript.\n\nThe opened window now summarizes the supported syntax and furthermore\ncontains two input fields for process code.\n\nIf you choose the 'simple' option in the drop-down menu, the program\n\n    spawn proc1() { ch?x }\n    spawn proc2() { ch!42 }\n\nshould appear with one process in each input field.\n\nIf you now press the 'Analyze'-bottom you should see output of this form:\n\n    Channel name mapping:\n    ----------------------\n    ch -\u003e 0\n    \n    \n    Iteration 0\n    ------------\n                                  ([], ε, Top*)\n    1:0? x;                              ([x -\u003e [-oo;+oo]], ?([0;0], [-oo;+oo]), Top*)\n    2:skip;                              ([x -\u003e [-oo;+oo]], ?([0;0], [-oo;+oo]), Top*)\n    \n    \n    Collective prefix': (ε + ?([0;0], [-oo;+oo]))\n    \n    \n                                  ([], ε, (ε + ?([0;0], [-oo;+oo])))\n    3:0! 42;                              ([], !([0;0], [42;42]), ε)\n    4:skip;                              ([], !([0;0], [42;42]), ε) \n    \n    Collective prefix': (ε + !([0;0], [42;42]))\n    \n    Iteration 1\n    ------------\n                                  ([], ε, (ε + !([0;0], [42;42])))\n    1:0? x;                              ([x -\u003e [42;42]], ?([0;0], [42;42]), ε)\n    2:skip;                              ([x -\u003e [42;42]], ?([0;0], [42;42]), ε) \n    \n    Collective prefix': (ε + ?([0;0], [42;42]))\n    \n    \n                                  ([], ε, (ε + ?([0;0], [42;42])))\n    3:0! 42;                              ([], !([0;0], [42;42]), ε)\n    4:skip;                              ([], !([0;0], [42;42]), ε) \n    \n    Collective prefix': (ε + !([0;0], [42;42]))\n    \n    Reached fixed point, bailing early\n\n\nThe 'Channel name mapping' says that the channel name 'ch' has been\nnumbered 0. The statement ch?x is therefore printed as 0?x under this\nrenaming. The output now lists the result of two iterations, each\nanalysing each process once.\n\nEach single process analysis result is printed as a decorated program\nwith a precondition above and postcondition at the right of each\nstatement. Recall that we automatically insert a dummy skip-statement\nat the end of each process. Each precondition and postcondition is\nshaped as a triple consisting of an abstract store, a history and a\nfuture. A line such as\n\n    ([x -\u003e [-oo;+oo]], ?([0;0], [-oo;+oo]), Top*)\n\nshould therefore be understood as\n\n- a store where the variable 'x' can take any value (between negative\n  infinity and positive infinity in the interval lattice),\n\n- a history consisting of just a single 'read action' of any value\n  (also in the above interval) from a channel in the interval [0;0],\n  i.e., channel 'ch' under the above channel numbering,\n\n- a future which represents the worst case assumption (any communication)\n\nIn addition, we compute and print the collective communication prefix\nof the process. For example, the first such\n\n    Collective prefix': (ε + ?([0;0], [-oo;+oo]))\n\nrepresents a prefix-closure of the above read.\n\n\nThe examples from the paper are available from the dropdown menu as\n'simple', 'deadlock', and 'non-termination'.\n\n\n\nTo run examples from the command line:\n--------------------------------------\n\nIn a terminal, build the extended top-level as described below and start it:\n\n    $ ./ledit ./main.top\n            OCaml version 4.02.3\n    \n    found .ocamlinit\n    # \n\n\nNow try analyzing a simple program consisting of two processes: one\nprocess reads a value from channel 'ch' and assigns the obtained\nvalue to the variable 'x', and another process writes the value '42'\nto the channel 'ch':\n\n    # Main.eval_twoproc_pp ([Ast.ExChread (\"ch\",\"x\")], [Ast.ExChwrite (\"ch\", Ast.Num 42)]) 2;;\n\n    [ ...output as above... ]\n\n\nAt the end of the file 'ast.ml' we include a number of additional examples.\n\n\nTo run the QuickCheck tests:\n----------------------------\n\nTo re-run the QuickCheck tests in the terminal first build the quickcheck tests as described below and then simply execute:\n\n    $ ./redomcheck.byte \n    check 1209 properties...\n    testing property 'parity.d increasing in argument 1'...\n      [✔] passed 1000 tests (0 preconditions failed)\n    testing property 'parity.d invariant in argument 1'...\n      [✔] passed 1000 tests (0 preconditions failed)\n    testing property 'parity.d increasing in argument 2'...\n      [✔] passed 1000 tests (0 preconditions failed)\n\n    [...many lines cut...]\n\n      [✔] passed 1000 tests (0 preconditions failed)\n    testing property 'Prodlattice(Storelattice(interval),interval,interval).widening invariant in argument 2'...\n      [✔] passed 1000 tests (0 preconditions failed)\n    tests run in 4480.10s\n    [✔] Success! (passed 1209 tests)\n\nRequirements:\n-------------\n\nTo build the prototype and try the examples you need OCaml version\n4.02.3 (or so) and the menhir parser generator, and to build and\nQuickCheck the abstract domains you need the library 'qcheck' v.0.3\nboth of which are available through the package manager OPAM.\n\nTo build the web-client you need the js_of_ocaml compiler version 2.7\nor so which is also available through OPAM. The web interface further\nrequires [CodeMirror](http://codemirror.net) (copy included).\n\nThe QuickCheck code builds on an extended version of 'LCheck' which is\nincluded with the prototype's source code. LCheck is a module for\nrandomized, property-based testing (QuickChecking) of lattices and\nlattice operations.  It is furthermore described in the paper\n\n    QuickChecking Static Analysis Properties\n    Jan Midtgaard and Anders Moeller, ICST'15\n    http://janmidtgaard.dk/papers/Midtgaard-Moeller:ICST15.pdf  \n\nThe module is also separately available [here](https://github.com/jmid/lcheck).\n\n\nBuild instructions:\n-------------------\n\nProvided the above requirements are met, building the top-level should\nbe as simple as\n\n    $ make top\n\nTo build the web-client\n\n    $ make js\n\nTo build the quickcheck test\n\n    $ make domcheck\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjmid%2Fiterated","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjmid%2Fiterated","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjmid%2Fiterated/lists"}