Contact
CoCalc Logo Icon
StoreFeaturesDocsShareSupport News AboutSign UpSign In
| Download

Logic of "all" + verbs + relative clauses, for a class at Indiana University

Path: ARC / Models.hs
Views: 6871
1
module Models where
2
import ARC/ExampleRules
3
import Data.List
4
import ARC/Syntax2
5
import ARC/FrontEnd
6
7
dropList :: [Int] -> Int -> [Int]
8
dropList list x = [i | i <- list, i /= x]
9
dropM :: M -> Int -> M
10
dropM m x = M { noun = (noun m), items = (dropList (items m) x) }
11
dropVb :: Vb -> Int -> Vb
12
dropVb v x = Vb { verb = (verb v), verb_items = [(i,j) | (i,j) <- verb_items v, i/= x, j/= x]}
13
dropModel :: Model -> Int -> Model
14
dropModel m x = Model { universe = (dropList (universe m) x), cnDict = map (\ n -> (dropM n x)) (cnDict m) , verbDict = map (\ v -> (dropVb v x)) (verbDict m) }
15
16
consecutiveDropList :: [Int] -> Int -> [Int]
17
helpForConsecutiveDrop :: Int -> Int -> Int
18
helpForConsecutiveDrop k l = if k < l then k else k -1
19
consecutiveDropList list x = [helpForConsecutiveDrop i x | i <- list, i /= x]
20
consecutiveDropM m x = M { noun = (noun m), items = (consecutiveDropList (items m) x) }
21
consecutiveDropVb :: Vb -> Int -> Vb
22
consecutiveDropVb v x = Vb { verb = (verb v), verb_items = [(helpForConsecutiveDrop i x, helpForConsecutiveDrop j x) | (i,j) <- verb_items v, i/= x, j/= x]}
23
consecutiveDropModel :: Model -> Int -> Model
24
consecutiveDropModel m x = Model { universe = (consecutiveDropList (universe m) x), cnDict = map (\ n -> (consecutiveDropM n x)) (cnDict m) , verbDict = map (\ v -> (consecutiveDropVb v x)) (verbDict m) }
25
26
maybeDrop model x gamma =
27
let
28
mNew = consecutiveDropModel model x --- was dropModel, not consecutiveDropModel
29
tvs = map (\ s -> (semanticsSent s mNew)) gamma
30
in
31
if (and tvs) then mNew else model
32
33
shorten :: Model -> [Sent] -> Model
34
shorten model gamma = foldl (\ m -> (\ x -> maybeDrop m x gamma)) model (universe model)
35
36
iterativelyShorten model gamma = if (model == shorten model gamma) then model else (iterativelyShorten (shorten model gamma) gamma)
37
38
{--dropALot m gamma = foldl (\acc x -> listU m) (listU m)
39
--}
40
data SentencesInModel = SentencesInModel { sentFromModels :: String, truthvalueOfSent :: [Bool]}
41
deriving Show
42
43
data M = M { noun :: CN, items :: [Int] }
44
deriving (Eq, Show)
45
46
data Vb = Vb { verb :: V, verb_items :: [(Int,Int)] }
47
deriving (Eq,Show)
48
49
type Universe = [Int]
50
data Model = Model {universe::Universe, cnDict :: [M], verbDict :: [Vb]}
51
deriving (Eq,Show)
52
53
semanticsTerm :: Term -> Model -> [Int]
54
semanticsTerm (CNasTerm (PCN Pos cn)) m = helper (CNasTerm (PCN Pos cn)) (cnDict m)
55
semanticsTerm (CNasTerm (PCN Neg cn)) m = (universe m) \\ semanticsTerm (CNasTerm (PCN Pos cn)) m
56
semanticsTerm (TermMaker (PV Pos tv) (TermNP All t)) m =
57
let
58
u = universe m
59
tt = semanticsTerm t m
60
vv = verbHelper tv (verbDict m)
61
in
62
[ x | x <- u, and (map (\ y -> implies (y `elem` tt) ((x,y) `elem` vv)) u)]
63
64
semanticsTerm (TermMaker (PV Pos tv) (TermNP Some t)) m =
65
let
66
u = universe m
67
tt = semanticsTerm t m
68
vv = verbHelper tv (verbDict m)
69
in
70
[ x | x <- u, or (map (\ y -> (y `elem` tt) && ((x,y) `elem` vv)) u)]
71
72
semanticsTerm (TermMaker (PV Neg tv) (TermNP All t)) m =
73
let
74
u = universe m
75
tt = semanticsTerm t m
76
vv = verbHelper tv (verbDict m)
77
in
78
[ x | x <- u, and (map (\ y -> implies (y `elem` tt) (not ((x,y) `elem` vv)) ) u)]
79
80
semanticsTerm (TermMaker (PV Neg tv) (TermNP Some t)) m =
81
let
82
u = universe m
83
tt = semanticsTerm t m
84
vv = verbHelper tv (verbDict m)
85
in
86
[ x | x <- u, or (map (\ y -> (y `elem` tt) && (not ((x,y) `elem` vv)) ) u)]
87
88
helper (CNasTerm (PCN Pos cn)) partialList
89
| null partialList = []
90
| cn == (noun $ head $ partialList) = items $ head partialList
91
| otherwise = helper (CNasTerm (PCN Pos cn)) (tail partialList)
92
93
implies b c = (not b) || c
94
95
verbHelper v vList
96
| null vList = []
97
| v == (verb $ head $ vList) = verb_items $ head vList
98
| otherwise = verbHelper v (tail vList)
99
100
semanticsSent :: Sent -> Model -> Bool
101
semanticsSent (Sent All t1 t2) m = and ( map (\ x -> x `elem` s2) s1)
102
where
103
s1 = semanticsTerm t1 m
104
s2 = semanticsTerm t2 m
105
106
semanticsSent (Sent Some t1 t2) m = or (map (\ x -> x `elem` s2) s1)
107
where
108
s1 = semanticsTerm t1 m
109
s2 = semanticsTerm t2 m
110
111
semanticsSent (Sent No t1 t2) m = and ( map (\ x -> not (x `elem` s2)) s1)
112
where
113
s1 = semanticsTerm t1 m
114
s2 = semanticsTerm t2 m
115
116
semanticsSent (Sent Most t1 t2) m =
117
let
118
s1 = semanticsTerm t1 m
119
s2 = semanticsTerm t2 m
120
intersection = s1 `intersect` s2
121
n = length s1
122
k = length intersection
123
in
124
n < 2 * k
125
126
semanticsSent (Sent Atleast t1 t2) m =
127
let
128
s1 = semanticsTerm t1 m
129
s2 = semanticsTerm t2 m
130
in
131
s2 <= s1
132
133
semanticsSent (Sent More t1 t2) m =
134
let
135
s1 = semanticsTerm t1 m
136
s2 = semanticsTerm t2 m
137
in
138
s2 < s1
139
140
--------- pretty printing of models below
141
142
data U = U {name::String, itemsU :: [Int] }
143
deriving Show
144
145
transMtoU t = (U (show(noun t)) (items t))
146
147
data Vextra = Vextra { verbextra :: String, verb_items_extra :: [(Int,Int)] }
148
deriving Show
149
150
transVtoVextra t = (Vextra (show(verb t)) (verb_items t))
151
152
{-
153
-- a type for fill functions
154
type Filler = Int -> String -> String
155
156
-- a type for describing table columns
157
data ColDesc t = ColDesc
158
{ colTitleFill :: Filler
159
, colTitle :: String
160
, colValueFill :: Filler
161
, colValue :: t -> String
162
}
163
-}
164
165
-- test data
166
test =
167
[ M Cats [1,2,3],
168
M Dogs [4,5,6],
169
M Skunks [1,3,5,6],
170
M Chordates [ ]
171
]
172
173
vTest = [Vb Sees [(1,1),(1,4),(3,4),(2,5)]]
174
175
model1 = Model {universe = [1,2,3,4,5,6], cnDict = test, verbDict = vTest}
176
177
{-
178
-- functions that fill a string (s) to a given width (n) by adding pad
179
-- character (c) to align left, right, or center
180
fillLeft c n s = s ++ replicate (n - length s) c
181
fillRight c n s = replicate (n - length s) c ++ s
182
fillCenter c n s = replicate l c ++ s ++ replicate r c
183
where x = n - length s
184
l = x `div` 2
185
r = x - l
186
187
-- functions that fill with spaces
188
left = fillLeft ' '
189
right = fillRight ' '
190
center = fillCenter ' '
191
-}
192
193
{-
194
--showTable :: [ColDesc t] -> [t] -> String
195
showTable cs ts =
196
let header = map colTitle cs
197
rows = [[colValue c t | c <- cs] | t <- ts]
198
widths = [maximum $ map length col | col <- transpose $ header : rows]
199
separator = intercalate "-+-" [replicate width '-' | width <- widths]
200
fillCols fill cols = intercalate " | " [fill c width col | (c, width, col) <- zip3 cs widths cols]
201
in
202
unlines $ fillCols colTitleFill header : separator : map (fillCols colValueFill) rows
203
-}
204
205
showModelNounsPlusJustifications m gamma phi = do
206
putStrLn ("The universe is the set of numbers in " ++ show(universe m)++".")
207
putStrLn " "
208
putStrLn "The nouns are interpreted as follows:"
209
putStrLn " "
210
showNouns m
211
putStrLn " "
212
putStrLn "Here is how the assumptions and purported conclusion fare in this model:"
213
putStrLn " "
214
showSentenceTruthValues m $ gamma++[phi]
215
216
showModelNounsVerbsPlusJustifications m gamma phi = do
217
putStrLn ("The universe is the set of numbers in " ++ show(universe m)++".")
218
putStrLn " "
219
putStrLn "The nouns and verbs are interpreted as follows:"
220
putStrLn " "
221
showNouns m
222
putStrLn " "
223
showVerbs m
224
putStrLn "Here is how the assumptions and purported conclusion fare in this model:"
225
putStrLn " "
226
showSentenceTruthValues m $ gamma++[phi]
227
228
showModelNounsOnly m = do
229
putStrLn ("The universe is the set of numbers in " ++ show(universe m)++".")
230
putStrLn " "
231
putStrLn "The nouns are interpreted as follows:"
232
putStrLn " "
233
showNouns m
234
235
showModel m = do
236
putStrLn ("The universe is the set of numbers in " ++ show(universe m)++".")
237
putStrLn " "
238
putStrLn "The nouns are interpreted as follows:"
239
putStrLn " "
240
showNouns m
241
putStrLn "The transitive verbs are interpreted as follows:"
242
putStrLn " "
243
showVerbs m
244
245
showNouns m = putStrLn $
246
showTable
247
[ ColDesc center "Noun" left name
248
, ColDesc center "Interpretation" left (intercalate ", " . map show . itemsU)
249
]
250
$ map transMtoU (cnDict m)
251
252
showVerbs m = putStrLn $
253
showTable
254
[ ColDesc center "Verb" left verbextra
255
, ColDesc center "Interpretation" left (intercalate ", " . map show . verb_items_extra)
256
]
257
$ map transVtoVextra (verbDict m)
258
259
--- showGeneric below is used in showModelPlus
260
showGeneric m nameLabel contentLabel recordList = putStrLn $
261
showTable
262
[ ColDesc center "Term" left nameLabel
263
, ColDesc center "Interpretation" left (intercalate ", " . map show . contentLabel)
264
] recordList
265
266
makeSentenceEntry s m = SentencesInModel (show s) [semanticsSent s m]
267
268
showSentenceTruthValues m gamma = putStrLn $
269
showTable
270
[ ColDesc center "Sentence" left sentFromModels
271
, ColDesc center "Truth Value" left (intercalate ", " . map show . truthvalueOfSent )
272
] (map (\ x -> makeSentenceEntry x m) (gamma))
273
274
showModelPlus mod tList = do
275
showModel mod
276
putStrLn " "
277
putStrLn "Extra information on the relevant terms:"
278
putStrLn " "
279
let rrrList = map (\ z -> (U { name = (show z) , itemsU = (semanticsTerm z mod) }) ) tList
280
showGeneric mod name itemsU rrrList
281
282
showModelNounsVerbsPlusJustificationsARC :: Model -> [Sent] -> Sent -> [Term] -> IO ()
283
showModelNounsVerbsPlusJustificationsARC m gamma phi tList = do
284
putStrLn ("The universe is the set of numbers in " ++ show(universe m)++".")
285
putStrLn " "
286
putStrLn "The nouns and verbs are interpreted as follows:"
287
putStrLn " "
288
showNouns m
289
putStrLn " "
290
showVerbs m
291
putStrLn "Extra information on the relevant terms:"
292
putStrLn " "
293
let rrrList = map (\ z -> (U { name = (show z) , itemsU = (semanticsTerm z m) }) ) tList
294
showGeneric m name itemsU rrrList
295
putStrLn "Here is how the assumptions and purported conclusion fare in this model:"
296
putStrLn " "
297
showSentenceTruthValues m (gamma++[phi])
298
299
{-
300
m gamma phi tList
301
-----------------
302
show (universe m)
303
showNouns n:
304
showTable
305
[ ColDesc center "Noun" left name
306
, ColDesc center "Interpretation" left (intercalate ", " . map show . itemsU)
307
]
308
$ map transMtoU (cnDict m)
309
showVerbs m:
310
showTable
311
[ ColDesc center "Verb" left verbextra
312
, ColDesc center "Interpretation" left (intercalate ", " . map show . verb_items_extra)
313
]
314
$ map transVtoVextra (verbDict m)
315
showGeneric m name itemsU (...):
316
showTable
317
[ ColDesc center "Term" left name
318
, ColDesc center "Interpretation" left (intercalate ", " . map show . itemsU)
319
] $ map (\ z -> U { name = show z, itemsU = semanticsTerm z m }) tList
320
showSentenceTruthValues m $ gamma ++ [phi]:
321
showTable
322
[ ColDesc center "Sentence" left sentFromModels
323
, ColDesc center "Truth Value" left (intercalate ", " . map show . truthvalueOfSent )
324
]
325
$ map (\ x -> makeSentenceEntry x m) $ gamma ++ [phi]
326
-}
327
328
329