#!/bin/sh
# -*- coding: utf-8 -*-
# Copyright (C) 2017, 2018 Laboratoire de Recherche et
# Développement de l'EPITA.
#
# This file is part of Spot, a model checking library.
#
# Spot is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# Spot is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
# License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

. ./defs
set -e

cat >l_formulas <<'EOF'
FG!b
FGc
F(a | Gb)
XF(b & Ga)
a | c | FG(!b & !c)
!a | FGb
F((!a & ((c & F!b) | (!c & Gb))) | (a & ((c & Gb) | (!c & F!b))))
F((c & F!b) | (!c & Gb))
F((!c R a) W G!b)
FG(((!b | (c M b)) & X(c & Xa)) | (b & (!c W !b) & X(!c | X!a)))
(Ga M c) M ((!b & Fb) M F(a | !b))
(Gb | X(!b M X!b)) M ((b & c) | (!b & !c))
F(c R (X!c W Fb))
XF!c & F(Fb R a)
(!c M F(b & Ga)) W (b U a)
EOF

cat >r_formulas <<'EOF'
GF(b | GF!c)
!b & G(G!c | XFc)
GF(b | c | (!c & XFb))
GFc | G(!b | !c)
G(Gb | Fc)
G(c | (c R Xc) | XF(b & !c))
Gc R XFb
G(c | (!b M (GFc | G!c)))
F(((c W Xb) & F(b R !c)) | ((!c M X!b) & G(!b U c)))
EOF

while read l_f; do
    ltl2tgba --parity='max odd' "$l_f" > l.hoa
    autfilt -q --acceptance-is='Fin(0) | Inf(1)' l.hoa ||
        autfilt -q --acceptance-is='Fin(0)' l.hoa
    while read r_f; do
        # Dualizing a deterministic transition-based parity automaton
        # to obtain a transition-based deterministic streett
        # automaton.  What we want to avoid as much as possible is
        # weak automata, because l.hoa is already weak and that would
        # make the sum/product weak as well.
        ltl2tgba "$r_f" -D --parity='min odd' | autfilt --dualize --gsa > r.hoa
        # Streett & Streett
        autfilt r.hoa --name="($l_f)&!($r_f)" --product=l.hoa -S > and.hoa
        autfilt -q --acceptance-is=Streett-like and.hoa
        # Streett | Streett
        autfilt r.hoa --name="($l_f)|!($r_f)" --product-or=l.hoa -S > or.hoa
        if ! grep -q '[ -]weak' l.hoa; then
            if ! grep -q '[ -]weak' r.hoa; then
                autfilt -q -v --acceptance-is=Streett-like or.hoa || exit 1
            fi
        fi

        autcross --language-preserved --verbose -F or.hoa -F and.hoa \
                 'autfilt %H --stats=%M | ltl2tgba >%O' \
                 'autfilt --cobuchi' 'autfilt --cobuchi -D'
    done <r_formulas
done <l_formulas
