Advertisement
chaoswjz

a4

Feb 22nd, 2018
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.72 KB | None | 0 0
  1. (* ****** ****** *)
  2. //
  3. // Title:
  4. // Principles of
  5. // Programming Languages
  6. // Course: CAS CS 520
  7. //
  8. // Semester: Spring, 2018
  9. //
  10. // Classroom: MCS B25
  11. // Class Time: TR 2:00-3:15
  12. //
  13. // Instructor: Hongwei Xi (hwxiATcsDOTbuDOTedu)
  14. //
  15. (* ****** ****** *)
  16. //
  17. // Due date: Tuesday, the 20th of February
  18. //
  19. (* ****** ****** *)
  20.  
  21. #include
  22. "share/atspre_staload.hats"
  23. #include
  24. "share/atspre_staload_libats_ML.hats"
  25.  
  26. (* ****** ****** *)
  27.  
  28. datatype term =
  29. //
  30. | TMint of (int)
  31. | TMstr of string
  32. //
  33. | TMtup of termlst
  34. | TMproj of (term, int)
  35. //
  36. | TMvar of string
  37. //
  38. | TMlam of (string, term(*body*))
  39. | TMapp of (term(*fun*), term(*arg*))
  40. | TMfix of (string(*f*), string(*x*), term)
  41. //
  42. | TMopr of (string(*opr*), termlst)
  43. | TMifnz of (term(*test*), term(*then*), term(*else*))
  44.  
  45. where termlst = list0(term)
  46.  
  47. (* ****** ****** *)
  48.  
  49. datatype value =
  50. | VALint of int
  51. | VALstr of string
  52. | VALtup of valuelst
  53. | VALfix of (term, envir)
  54. | VALlam of (term, envir)
  55.  
  56. where
  57.  
  58. envir =
  59. list0($tup(string, value))
  60.  
  61. and valuelst = list0(value)
  62.  
  63.  
  64. (* ****** ****** *)
  65.  
  66. extern
  67. fun
  68. print_value(t0: value): void
  69. extern
  70. fun
  71. fprint_value(out: FILEref, t0: value): void
  72.  
  73. overload print with print_value
  74. overload fprint with fprint_value
  75.  
  76. (* ****** ****** *)
  77.  
  78. implement
  79. fprint_val<value> = fprint_value
  80.  
  81. (* ****** ****** *)
  82.  
  83. implement
  84. print_value
  85. (t0) = fprint_value(stdout_ref, t0)
  86.  
  87. implement
  88. fprint_value(out, t0) =
  89. (
  90. case+ t0 of
  91. //
  92. | VALint(i) => fprint!(out, "VALint(", i, ")")
  93. | VALstr(s) => fprint!(out, "VALstr(", s, ")")
  94. //
  95. | VALtup(vs) => fprint!(out, "VALtup(", vs, ")")
  96. //
  97. | VALlam(_, _) => fprint!(out, "VALlam(_, _)")
  98. | VALfix(_, _) => fprint!(out, "VALfix(_, _)")
  99. //
  100. )
  101.  
  102. (* ****** ****** *)
  103. //
  104. // HX-2018-02-08:
  105. // please implement the
  106. // following one on your own:
  107. //
  108. extern
  109. fun interp1(t0: term): value
  110. //
  111.  
  112. extern
  113. fun
  114. interp2 : (term, envir) -> value
  115.  
  116. overload interp with interp1
  117. overload interp with interp2
  118.  
  119. (* ****** ****** *)
  120.  
  121. implement
  122. interp1(src) =
  123. interp2(src, list0_nil())
  124.  
  125. (* ****** ****** *)
  126.  
  127. extern
  128. fun
  129. envir_find :
  130. (envir, string) -> value
  131. implement
  132. envir_find(env, x0) =
  133. (
  134. case- env of
  135. | list0_cons(xv, env) =>
  136. if x0 = xv.0
  137. then xv.1 else envir_find(env, x0)
  138. // end of [if]
  139. )
  140.  
  141. fun
  142. interp2_list
  143. (ts: termlst, env: envir): valuelst =
  144. list0_map<term><value>(ts, lam(t) => interp2(t, env))
  145.  
  146. implement
  147. interp2(t0, env) =
  148. (
  149. case t0 of
  150. //
  151. | TMint(i) => VALint(i)
  152. | TMstr(s) => VALstr(s)
  153. //
  154. | TMvar(x) => envir_find(env, x)
  155. //
  156. | TMlam _ => VALlam(t0, env)
  157. | TMfix _ => VALfix(t0, env)
  158. //
  159. | TMtup(ts) =>
  160. VALtup(interp2_list(ts, env))
  161. //
  162. | TMproj
  163. (t_tup, i) => let
  164. val v_tup = interp2(t_tup, env)
  165. in
  166. case- v_tup of
  167. | VALtup(vs) => vs[i] // = list0_get_at_exn(vs, i)
  168. end
  169. //
  170. | TMapp(t1, t2) => let
  171. val v1 = interp2(t1, env)
  172. in
  173. case- v1 of
  174. | VALlam
  175. (t_lam, env_lam) => let
  176. val v2 = interp2(t2, env)
  177. val-TMlam(x, t_body) = t_lam
  178. val env_lam = list0_cons($tup(x, v2), env_lam)
  179. in
  180. interp2(t_body, env_lam)
  181. end
  182. | VALfix
  183. (t_fix, env_fix) => let
  184. val v2 = interp2(t2, env)
  185. val-TMfix(f, x, t_body) = t_fix
  186. val env_fix = list0_cons($tup(x, v2), env_fix)
  187. val env_fix = list0_cons($tup(f, v1), env_fix)
  188. in
  189. interp2(t_body, env_fix)
  190. end
  191. end // end of [TMapp]
  192. //
  193. | TMopr _ => interp2_opr(t0, env)
  194. //
  195. | TMifnz
  196. (t1, t2, t3) => let
  197. val v1 = interp2(t1, env)
  198. in
  199. case- v1 of
  200. | VALint(i) =>
  201. interp2(if i != 0 then t2 else t3, env)
  202. end
  203. ) where
  204. {
  205. //
  206. fun
  207. interp2_opr
  208. ( t0: term
  209. , env: envir): value = let
  210. //
  211. #define :: list0_cons
  212. #define nil list0_nil
  213. //
  214. val-TMopr(opr, ts) = t0
  215. //
  216. val vs =
  217. list0_map<term><value>(ts, lam(t) => interp2(t, env))
  218. //
  219. in
  220. case- opr of
  221. | "+" =>
  222. (
  223. case- vs of
  224. | VALint(i1)::VALint(i2)::nil() => VALint(i1+i2)
  225. )
  226. | "-" =>
  227. (
  228. case- vs of
  229. | VALint(i1)::VALint(i2)::nil() => VALint(i1-i2)
  230. )
  231. | "*" =>
  232. (
  233. case- vs of
  234. | VALint(i1)::VALint(i2)::nil() => VALint(i1*i2)
  235. )
  236. | "/" =>
  237. (
  238. case- vs of
  239. | VALint(i1)::VALint(i2)::nil() => VALint(i1/i2)
  240. )
  241. | "~" =>
  242. (
  243. case- vs of VALint(i1)::nil() => VALint(~i1)
  244. )
  245. | "abs" =>
  246. (
  247. case- vs of VALint(i1)::nil() => VALint(abs(i1))
  248. )
  249. | ">=" =>
  250. (
  251. case- vs of
  252. | VALint(i1)::VALint(i2)::nil() => if i1 >= i2 then VALint(1) else VALint(0)
  253. )
  254. | "<=" =>
  255. (
  256. case- vs of
  257. | VALint(i1)::VALint(i2)::nil() => if i1 <= i2 then VALint(1) else VALint(0)
  258. )
  259. | ">" =>
  260. (
  261. case- vs of
  262. | VALint(i1)::VALint(i2)::nil() => if i1 > i2 then VALint(1) else VALint(0)
  263. )
  264. | "<" =>
  265. (
  266. case- vs of
  267. | VALint(i1)::VALint(i2)::nil() => if i1 < i2 then VALint(1) else VALint(0)
  268. )
  269. | "print" =>
  270. (
  271. case- vs of
  272. | VALstr(s1)::nil() =>
  273. let
  274. val ()=print(s1)
  275. in
  276. VALstr(s1)
  277. end
  278. | VALint(i1)::nil() =>
  279. let
  280. val ()=print(i1)
  281. in
  282. VALint(i1)
  283. end
  284. )
  285. | "==" =>
  286. (
  287. case- vs of
  288. | VALint(i1)::VALint(i2)::nil() => if i1 = i2 then VALint(1) else VALint(0)
  289. )
  290. | "!=" =>
  291. (
  292. case- vs of
  293. | VALint(i1)::VALint(i2)::nil() => if i1 != i2 then VALint(1) else VALint(0)
  294. )
  295. end // end of [interp2_opr]
  296.  
  297. } (* end of [interp2] *)
  298.  
  299. (* ****** ****** *)
  300. //
  301. val x = TMvar("x")
  302. val f = TMvar("f")
  303. //
  304. (* ****** ****** *)
  305.  
  306. fun
  307. sub_term_int
  308. (t1: term, i2: int): term =
  309. TMopr
  310. ( "-"
  311. , list0_tuple(t1, TMint(i2)))
  312.  
  313. fun
  314. sub_int_term
  315. (i1: int, t2: term): term =
  316. TMopr
  317. ( "-"
  318. , list0_tuple(TMint(i1), t2))
  319.  
  320. fun
  321. add_term_term
  322. (t1: term, t2: term): term =
  323. TMopr("+", list0_tuple(t1, t2))
  324.  
  325. fun
  326. add_term_int
  327. (t1: term, i2: int): term =
  328. TMopr("+", list0_tuple(t1, TMint(i2)))
  329.  
  330. fun
  331. mul_term_term
  332. (t1: term, t2: term): term =
  333. TMopr("*", list0_tuple(t1, t2))
  334.  
  335. fun
  336. equal_term_int
  337. (t1: term, i2: int): term =
  338. TMopr("==", list0_tuple(t1, TMint(i2)))
  339.  
  340. overload - with sub_term_int
  341. overload + with add_term_term
  342. overload * with mul_term_term
  343.  
  344. #define N 8
  345.  
  346. fun bd(t0: term, t1: term, t2: term, t3: term, t4: term, t5: term, t6: term, t7: term): term =
  347. TMtup(cons0(t0, cons0(t1, cons0(t2,cons0(t3,cons0(t4,cons0(t5,cons0(t6,cons0(t7,nil0())))))))))
  348. fun pair(t0: term, t1: term): term = TMtup(cons0(t0, cons0(t1, nil0())))
  349.  
  350. fun fst(t0: term): term = TMproj(t0, 0)
  351. fun snd(t0: term): term = TMproj(t0, 1)
  352. fun trd(t0: term): term = TMproj(t0, 2)
  353. fun fur(t0: term): term = TMproj(t0, 3)
  354. fun fiv(t0: term): term = TMproj(t0, 4)
  355. fun six(t0: term): term = TMproj(t0, 5)
  356. fun sev(t0: term): term = TMproj(t0, 6)
  357. fun eig(t0: term): term = TMproj(t0, 7)
  358.  
  359. val i = TMvar("i")
  360. val f = TMvar("f")
  361. val board=TMvar("board")
  362.  
  363. val print_dots = TMfix("f","i",TMifnz(TMopr(">",list0_tuple(i,TMint(0))),pair(TMopr("print",list0_tuple(TMstr(". "))),TMapp(f,i-1)),TMstr("")))
  364.  
  365. val print_row =
  366. TMlam("i",TMtup(cons0(TMapp(print_dots,i),cons0(TMopr("print",list0_tuple(TMstr("Q "))),cons0(TMapp(print_dots,sub_int_term(N,i)-1),
  367. cons0(TMopr("print",list0_tuple(TMstr("\n"))),nil0()))))))
  368.  
  369. val print_board=TMlam
  370. (
  371. "board",
  372. TMtup(cons0(TMapp(print_row,fst(board)),
  373. cons0(TMapp(print_row,snd(board)),
  374. cons0(TMapp(print_row,trd(board)),
  375. cons0(TMapp(print_row,fur(board)),
  376. cons0(TMapp(print_row,fiv(board)),
  377. cons0(TMapp(print_row,six(board)),
  378. cons0(TMapp(print_row,sev(board)),
  379. cons0(TMapp(print_row,eig(board)),
  380. cons0(TMopr("print",list0_tuple(TMstr("\n"))),
  381. nil0()))))))))))
  382. )
  383.  
  384. val bd_i=TMvar("bd_i")
  385.  
  386. val board_get=TMlam
  387. (
  388. "bd_i",
  389. TMifnz
  390. (
  391. equal_term_int(snd(bd_i),0),
  392. fst(fst(bd_i)),
  393. TMifnz
  394. (
  395. equal_term_int(snd(bd_i),1),
  396. snd(fst(bd_i)),
  397. TMifnz
  398. (
  399. equal_term_int(snd(bd_i),2),
  400. trd(fst(bd_i)),
  401. TMifnz
  402. (
  403. equal_term_int(snd(bd_i),3),
  404. fur(fst(bd_i)),
  405. TMifnz
  406. (
  407. equal_term_int(snd(bd_i),4),
  408. fiv(fst(bd_i)),
  409. TMifnz
  410. (
  411. equal_term_int(snd(bd_i),5),
  412. six(fst(bd_i)),
  413. TMifnz
  414. (
  415. equal_term_int(snd(bd_i),6),
  416. sev(fst(bd_i)),
  417. TMifnz
  418. (
  419. equal_term_int(snd(bd_i),7),
  420. eig(fst(bd_i)),
  421. TMint(~1)
  422. )
  423. )
  424. )
  425. )
  426. )
  427. )
  428. )
  429. )
  430. )
  431.  
  432. val bd_i_j=TMvar("bd_i_j")
  433.  
  434. val board_set=TMlam
  435. (
  436. "bd_i_j",
  437. TMifnz
  438. (
  439. equal_term_int(snd(bd_i_j),0),
  440. TMtup(cons0(trd(bd_i_j), cons0(snd(fst(bd_i_j)), cons0(trd(fst(bd_i_j)),cons0(fur(fst(bd_i_j)),cons0(fiv(fst(bd_i_j)),cons0(six(fst(bd_i_j)),cons0(sev(fst(bd_i_j)),cons0(eig(fst(bd_i_j)),nil0()))))))))),
  441. TMifnz
  442. (
  443. equal_term_int(snd(bd_i_j),1),
  444. TMtup(cons0(fst(fst(bd_i_j)), cons0(trd(bd_i_j), cons0(trd(fst(bd_i_j)),cons0(fur(fst(bd_i_j)),cons0(fiv(fst(bd_i_j)),cons0(six(fst(bd_i_j)),cons0(sev(fst(bd_i_j)),cons0(eig(fst(bd_i_j)),nil0()))))))))),
  445. TMifnz
  446. (
  447. equal_term_int(snd(bd_i_j),2),
  448. TMtup(cons0(fst(fst(bd_i_j)), cons0(snd(fst(bd_i_j)), cons0(trd(bd_i_j),cons0(fur(fst(bd_i_j)),cons0(fiv(fst(bd_i_j)),cons0(six(fst(bd_i_j)),cons0(sev(fst(bd_i_j)),cons0(eig(fst(bd_i_j)),nil0()))))))))),
  449. TMifnz
  450. (
  451. equal_term_int(snd(bd_i_j),3),
  452. TMtup(cons0(fst(fst(bd_i_j)), cons0(snd(fst(bd_i_j)), cons0(trd(fst(bd_i_j)),cons0(trd(bd_i_j),cons0(fiv(fst(bd_i_j)),cons0(six(fst(bd_i_j)),cons0(sev(fst(bd_i_j)),cons0(eig(fst(bd_i_j)),nil0()))))))))),
  453. TMifnz
  454. (
  455. equal_term_int(snd(bd_i_j),4),
  456. TMtup(cons0(fst(fst(bd_i_j)), cons0(snd(fst(bd_i_j)), cons0(trd(fst(bd_i_j)),cons0(fur(fst(bd_i_j)),cons0(trd(bd_i_j),cons0(six(fst(bd_i_j)),cons0(sev(fst(bd_i_j)),cons0(eig(fst(bd_i_j)),nil0()))))))))),
  457. TMifnz
  458. (
  459. equal_term_int(snd(bd_i_j),5),
  460. TMtup(cons0(fst(fst(bd_i_j)), cons0(snd(fst(bd_i_j)), cons0(trd(fst(bd_i_j)),cons0(fur(fst(bd_i_j)),cons0(fiv(fst(bd_i_j)),cons0(trd(bd_i_j),cons0(sev(fst(bd_i_j)),cons0(eig(fst(bd_i_j)),nil0()))))))))),
  461. TMifnz
  462. (
  463. equal_term_int(snd(bd_i_j),6),
  464. TMtup(cons0(fst(fst(bd_i_j)), cons0(snd(fst(bd_i_j)), cons0(trd(fst(bd_i_j)),cons0(fur(fst(bd_i_j)),cons0(fiv(fst(bd_i_j)),cons0(six(fst(bd_i_j)),cons0(trd(bd_i_j),cons0(eig(fst(bd_i_j)),nil0()))))))))),
  465. TMifnz
  466. (
  467. equal_term_int(snd(bd_i_j),7),
  468. TMtup(cons0(fst(fst(bd_i_j)), cons0(snd(fst(bd_i_j)), cons0(trd(fst(bd_i_j)),cons0(fur(fst(bd_i_j)),cons0(fiv(fst(bd_i_j)),cons0(six(fst(bd_i_j)),cons0(sev(fst(bd_i_j)),cons0(trd(bd_i_j),nil0()))))))))),
  469. fst(bd_i_j)
  470. )
  471. )
  472. )
  473. )
  474. )
  475. )
  476. )
  477. )
  478. )
  479.  
  480. val TMtrue=TMint(1)
  481. val TMfalse=TMint(0)
  482. val i0_j0_i1_j1=TMvar("i0_j0_i1_j1")
  483.  
  484. val safety_test1=TMlam
  485. (
  486. "i0_j0_i1_j1",
  487. TMifnz
  488. (
  489. TMopr("!=", list0_tuple(snd(i0_j0_i1_j1),fur(i0_j0_i1_j1))),
  490. TMifnz
  491. (
  492. TMopr("!=", list0_tuple(
  493. TMopr("abs",list0_tuple(TMopr("-",list0_tuple(fst(i0_j0_i1_j1),trd(i0_j0_i1_j1))))),
  494. TMopr("abs",list0_tuple(TMopr("-",list0_tuple(snd(i0_j0_i1_j1),fur(i0_j0_i1_j1))))))),
  495. TMtrue,
  496. TMfalse
  497. ),
  498. TMfalse
  499. )
  500. )
  501.  
  502. val i0_j0_bd_i=TMvar("i0_j0_bd_i")
  503. fun fourpara(t0: term, t1: term, t2: term, t3: term): term = TMtup(cons0(t0, cons0(t1, cons0(t2, cons0(t3, nil0())))))
  504.  
  505. val safety_test2=TMfix
  506. (
  507. "f","i0_j0_bd_i",
  508. TMifnz
  509. (
  510. TMopr(">=",list0_tuple(fur(i0_j0_bd_i),TMint(0))),
  511. TMifnz
  512. (
  513. TMapp(safety_test1,fourpara(fst(i0_j0_bd_i),snd(i0_j0_bd_i),fur(i0_j0_bd_i),TMapp(board_get,pair(trd(i0_j0_bd_i),fur(i0_j0_bd_i))))),
  514. TMapp(f,fourpara(fst(i0_j0_bd_i),snd(i0_j0_bd_i),trd(i0_j0_bd_i),fur(i0_j0_bd_i)-1)),
  515. TMfalse
  516. ),
  517. TMtrue
  518. )
  519. )
  520.  
  521. var bd_i_j_nsol=TMvar("bd_i_j_nsol")
  522. fun threepara(t0: term, t1: term, t2: term): term = TMtup(cons0(t0, cons0(t1, cons0(t2, nil0()))))
  523.  
  524. val search=TMfix
  525. (
  526. "f","bd_i_j_nsol",
  527. TMifnz
  528. (
  529. TMopr("<",list0_tuple(trd(bd_i_j_nsol),TMint(N))),
  530. TMifnz
  531. (
  532. TMapp(safety_test2,fourpara(snd(bd_i_j_nsol),trd(bd_i_j_nsol),fst(bd_i_j_nsol),snd(bd_i_j_nsol)-1)),
  533. TMifnz
  534. (
  535. equal_term_int(add_term_int(snd(bd_i_j_nsol),1),N),
  536. TMtup
  537. (cons0(TMopr("print",list0_tuple(TMstr("Solution #"))),
  538. cons0(TMopr("print",list0_tuple(add_term_int(fur(bd_i_j_nsol),1))),
  539. cons0(TMopr("print",list0_tuple(TMstr(":\n\n"))),
  540. cons0(TMapp(print_board,TMapp(board_set,threepara(fst(bd_i_j_nsol),snd(bd_i_j_nsol),trd(bd_i_j_nsol)))),
  541. cons0(TMapp(f,fourpara(fst(bd_i_j_nsol),snd(bd_i_j_nsol),add_term_int(trd(bd_i_j_nsol),1),add_term_int(fur(bd_i_j_nsol),1))),
  542. nil0())))))
  543. ),
  544. TMapp(f,fourpara(TMapp(board_set,threepara(fst(bd_i_j_nsol),snd(bd_i_j_nsol),trd(bd_i_j_nsol))),add_term_int(snd(bd_i_j_nsol),1),TMint(0),fur(bd_i_j_nsol)))
  545. ),
  546. TMapp(f,fourpara(fst(bd_i_j_nsol),snd(bd_i_j_nsol),add_term_int(trd(bd_i_j_nsol),1),fur(bd_i_j_nsol)))
  547. ),
  548. TMifnz
  549. (
  550. TMopr(">",list0_tuple(snd(bd_i_j_nsol),TMint(0))),
  551. TMapp(f,fourpara(fst(bd_i_j_nsol),snd(bd_i_j_nsol)-1,add_term_int(TMapp(board_get,pair(fst(bd_i_j_nsol),snd(bd_i_j_nsol)-1)),1),fur(bd_i_j_nsol))),
  552. fur(bd_i_j_nsol)
  553. )
  554. )
  555. )
  556.  
  557. val bdpara=bd(TMint(0),TMint(0),TMint(0),TMint(0),TMint(0),TMint(0),TMint(0),TMint(0))
  558.  
  559. val nsol = TMapp(search,fourpara(bdpara,TMint(0),TMint(0),TMint(0)))
  560.  
  561. (* ****** ****** *)
  562.  
  563. implement main0()=
  564. {
  565. val ()= println!("nsol = ",interp(nsol))
  566. }
  567.  
  568. (* end of [assign04.dats] *)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement