packages feed

cpsa-4.4.1: coq/Role.v

(* Protocol Roles

Copyright (c) 2021 The MITRE Corporation

This program is free software: you can redistribute it and/or
modify it under the terms of the BSD License as published by the
University of California. *)

Require Import List ListSet Bool Program Monad Proc Alg.

(** * Protocol Roles *)

Record role: Set :=
  mkRole {
      trace: list evt;
      uniqs: list alg;
      inputs: list alg;
      outputs: list alg }.

(** Is [x] not in list [l]? *)

Definition not_in (x: alg) (l: list alg): bool :=
  negb (set_mem alg_dec x l).

(** Does list [l] contain duplicates? *)

Fixpoint has_no_dups (l: list alg): bool :=
  match l with
  | nil => true
  | x :: xs => not_in x xs && has_no_dups xs
  end.

(** Is [r] a valid role? *)

Definition valid_role (r: role): bool :=
  match fold_m well_formed_event nil (trace r) with
  | None => false
  | Some decls =>
    forallb (well_typed decls) (uniqs r) &&
    forallb (flip orig (trace r)) (uniqs r) &&
    forallb is_basic (uniqs r) &&
    has_no_dups (uniqs r) &&
    forallb (well_typed_with_chan decls) (inputs r) &&
    forallb (fun t => is_basic t || is_chan t) (inputs r) &&
    forallb receivable (map evt_msg (trace r)) &&
    forallb receivable (outputs r) &&
    forallb (well_typed decls) (outputs r) &&
    forallb (flip not_in (uniqs r)) (inputs r) &&
    forallb (flip not_in (outputs r)) (inputs r)
  end.