-- | This is the examples module accompanying the implementation of Dung's 
-- argumentation frameworks. 
--
-- This module contains a collection of examples, showing how to define 
-- arguments, argumentation frameworks and how to use the standard definitions.
--
-- To run these examples, or your own: start GHCi and do the following:
--
-- @\:l Language.Dung.Examples@
-- 
module Language.Dung.Examples 
  (
   -- * Example uses of the basic definitions 
   -- |Given @a = \"A\"@, @b = \"B\"@, @c = \"C\"@
   AbsArg, a, b, c, exampleAF, exampleAF2, 
   -- * Example uses of the fixpoint definitions
   faf,
   -- * Example uses of the basic labelling definitions
   -- |Given @d = \"D\"@, @e = \"E\"@
   d, e, exampleAF3, exampleAF4,
   -- * Example uses of the input functionality
   exampleAF5,
   -- * Example uses of the output functionality
   output, output2, output3, output4, output5
  )
 where
import Language.Dung.AF
import Language.Dung.Input
import Language.Dung.Output
-- | The simplest abstract argument is an argument identifiable by its name
type AbsArg = String 


a, b, c :: AbsArg 
a = "A"
b = "B"
c = "C"

-- |Example AF: A -> B -> C 
exampleAF :: DungAF AbsArg
exampleAF = AF [a, b, c] [(a, b), (b, c)]

-- |Example AF: A \<-> B
--
-- Now follow a few example outputs using the above argumentation frameworks.
--
-- [setAttacks:]
-- 
-- @[a,b]@ 'setAttacks' @c@ in the argumentation framework 'exampleAF':
-- 
-- >>> setAttacks exampleAF [a,b] c
-- True
--
-- >>> setAttacks exampleAF [b,c] a
-- False
-- 
-- >>> setAttacks exampleAF2 [] b
-- False
--
-- [conflictFree:]
--
-- @\[a,c\]@ is 'conflictFree' in the argumentation framework 'exampleAF':
-- 
-- >>> conflictFree exampleAF [a,c]
-- True
--
-- >>> conflictFree exampleAF [a,b,c]
-- False
--
-- >>> conflictFree exampleAF2 [a,b]
-- False
-- 
-- [acceptable:]
--
-- @c@ is acceptable w.r.t. @\[a,b\]@ in the argumentation framework 'exampleAF':
--
-- >>> acceptable exampleAF c [a,b]
-- True
-- 
-- >>> acceptable exampleAF c [] 
-- False
--
-- >>> acceptable exampleAF b [a,b,c] 
-- False
-- 
-- [admissible:]
-- 
-- @\[a,b,c\]@ is admissible in the argumentation framework 'exampleAF':
--
-- >>> admissible exampleAF [a,b,c]
-- False
-- 
-- >>> admissible exampleAF [a,c]
-- True
-- 
-- >>> admissible exampleAF [a]
-- True
--
-- [grounded:]
-- 
-- The grounded labelling of the argumentation frameworks 'exampleAF'
-- and 'exampleAF2':
-- 
-- >>> grounded exampleAF
-- [("A",In),("C",In),("B",Out)]
-- 
-- >>> grounded exampleAF2
-- [("A",Undecided),("B",Undecided)]
--
-- [groundedExt:]
-- 
-- The grounded extension of the argumentation frameworks 'exampleAF'
-- and 'exampleAF2':
--
-- >>> groundedExt exampleAF
-- ["A", "C"]
-- >>> groundedExt exampleAF2
-- []
exampleAF2 :: DungAF AbsArg 
exampleAF2 = AF [a, b] [(a, b), (b, a)]

-- |fixed point function for a specific argumentation framework,
-- @faf = f exampleAF@.
-- 
-- [groundedF:]
--
-- The grounded extension of the argumentation framework 'exampleAF' using the
-- fixpoint definition:
--
-- >>> groundedF faf
-- ["A","C"]
--
-- >>> groundedF (f exampleAF2)
-- []
faf :: [AbsArg] -> [AbsArg]
faf = f exampleAF

d, e :: AbsArg 
d = "D"
e = "E"

-- |Left hand side of Fig1. in Caminada.
-- Arguments are: {a,b,c,d}. 
-- Attacks: {(a, a), (a, c), (b, c), (c, d)}
exampleAF3 :: DungAF AbsArg
exampleAF3 = AF [a, b, c, d] [(a, a), (a, c), (b, c), (c, d)]

-- |Right hand side of Fig1. in Caminada.
-- Arguments are: {a,b,c,d,e}. 
-- Attacks: {(a, b), (b, a), (b, c), (c, d), (d, e), (e, c)}
--
-- [complete:]
-- 
-- The complete labellings of the argumentation framework 'exampleAF3'
-- and 'exampleAF4':
-- 
-- >>> complete exampleAF3
-- [
--   [("A",Undecided),("B",In),("C",Out),("D",In)]
-- ]
-- 
-- >>> complete exampleAF4
-- [
--   [("A",Out),("B",In),("C",Out),("D",In),("E",Out)],
--   [("A",In),("B",Out),("C",Undecided),("D",Undecided),("E",Undecided)],
--   [("A",Out),("B",In),("C",Out),("D",Undecided),("E",Undecided)]
-- ]
--
-- [completeExt:]
-- 
-- The complete extensions of the argumentation frameworks 'exampleAF3'
-- and 'exampleAF4':
--
-- >>> completeExt exampleAF3
-- [
--   ["B","D"]
-- ]
-- >>> completeExt exampleAF4
-- [
--   ["B","D"],
--   ["A"],
--   ["B"]
-- ]
--
-- [semiStable:]
-- 
-- The semi-stable labellings of the argumentation framework 'exampleAF3'
-- and 'exampleAF4':
-- 
-- >>> semiStable exampleAF3
-- [
--   [("A",Undecided),("B",In),("C",Out),("D",In)]
-- ]
-- 
-- >>> semiStable exampleAF4
-- [
--   [("A",Out),("B",In),("C",Out),("D",In),("E",Out)],
-- ]
--
-- [semiStableExt:]
-- 
-- The complete extensions of the argumentation frameworks 'exampleAF3'
-- and 'exampleAF4':
--
-- >>> semiStableExt exampleAF3
-- [
--   ["B","D"]
-- ]
-- >>> semiStableExt exampleAF4
-- [
--   ["B","D"],
-- ]
--
exampleAF4 :: DungAF AbsArg
exampleAF4 = AF [a, b, c, d, e] [(a, b), (b, a), (b, c), (c, d), (d, e), (e, c)]

-- |Parsed example as given on the CEGARTIX webpage:
-- <http://www.dbai.tuwien.ac.at/proj/argumentation/cegartix/>.
-- 
-- @
-- arg(a).
-- arg(b).
-- arg(c).
-- arg(d).
-- arg(e).
-- arg(f).
-- arg(g).
-- att(a,b).
-- att(c,b).
-- att(c,d).
-- att(d,c).
-- att(d,e).
-- att(e,g).
-- att(f,e).
-- att(g,f).
-- @
-- 
-- This is given as a literal string to 'parseAF'. 
exampleAF5 :: DungAF AbsArg
exampleAF5 = case 
  parseAF 
    "arg(a).\
    \arg(b).\
    \arg(c).\
    \arg(d).\
    \arg(e).\
    \arg(f).\
    \arg(g).\
    \att(a,b).\
    \att(c,b).\
    \att(c,d).\
    \att(d,c).\
    \att(d,e).\
    \att(e,g).\
    \att(f,e).\
    \att(g,f)."
      of 
  Left err -> error (show err)
  Right af -> af

-- |Output 'String' corresponding to 'exampleAF', 
-- i.e. @toCegartix exampleAF@.
--
-- >>> putStr output
-- arg("A").
-- arg("B").
-- arg("C").
-- att("A","B").
-- att("B","C").
output :: String
output = toCegartix exampleAF

-- |Output 'String' corresponding to 'exampleAF2', 
-- i.e. @toCegartix exampleAF2@.
--
-- >>> putStr output2
-- arg("A").
-- arg("B").
-- att("A","B").
-- att("B","A").
output2 :: String
output2 = toCegartix exampleAF2

-- |Output 'String' corresponding to 'exampleAF3', 
-- i.e. @toCegartix exampleAF3@.
--
-- >>> putStr output3
-- arg("A").
-- arg("B").
-- arg("C").
-- arg("D").
-- att("A","A").
-- att("A","C").
-- att("B","C").
-- att("C","D").
output3 :: String
output3 = toCegartix exampleAF3

-- |Output 'String' corresponding to 'exampleAF4', 
-- i.e. @toCegartix exampleAF4@.
--
-- >>> putStr output4
-- arg("A").
-- arg("B").
-- arg("C").
-- arg("D").
-- arg("E").
-- att("A","B").
-- att("B","A").
-- att("B","C").
-- att("C","D").
-- att("D","E").
-- att("E","C").
output4 :: String
output4 = toCegartix exampleAF4

-- |Output 'String' corresponding to 'exampleAF5', 
-- i.e. @toCegartix exampleAF5@.
output5 :: String
output5 = toCegartix exampleAF5