shen-ruby 0.12.1 → 0.13.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (102) hide show
  1. checksums.yaml +4 -4
  2. data/HISTORY.md +5 -0
  3. data/README.md +8 -12
  4. data/Rakefile +4 -9
  5. data/bin/shen_test_suite.rb +0 -1
  6. data/bin/srrepl +2 -4
  7. data/lib/shen_ruby/shen.rb +98 -0
  8. data/lib/shen_ruby/version.rb +1 -1
  9. data/shen-ruby.gemspec +3 -3
  10. data/shen/README.txt +9 -13
  11. data/shen/release/BSD +24 -0
  12. data/shen/release/klambda/core.kl +157 -0
  13. data/shen/release/klambda/declarations.kl +109 -0
  14. data/shen/release/klambda/load.kl +59 -0
  15. data/shen/release/klambda/macros.kl +91 -0
  16. data/shen/release/klambda/prolog.kl +228 -0
  17. data/shen/release/klambda/reader.kl +198 -0
  18. data/shen/release/klambda/sequent.kl +142 -0
  19. data/shen/release/klambda/sys.kl +253 -0
  20. data/shen/release/klambda/t-star.kl +123 -0
  21. data/shen/release/klambda/toplevel.kl +110 -0
  22. data/shen/release/klambda/track.kl +79 -0
  23. data/shen/release/{k_lambda → klambda}/types.kl +41 -63
  24. data/shen/release/klambda/writer.kl +81 -0
  25. data/shen/release/klambda/yacc.kl +87 -0
  26. data/shen/release/license.pdf +0 -0
  27. data/shen/release/test_programs/Chap13/problems.txt +26 -26
  28. data/shen/release/test_programs/README.shen +52 -52
  29. data/shen/release/test_programs/TinyLispFunctions.txt +15 -15
  30. data/shen/release/test_programs/TinyTypes.shen +55 -55
  31. data/shen/release/test_programs/binary.shen +24 -24
  32. data/shen/release/test_programs/bubble_version_1.shen +28 -28
  33. data/shen/release/test_programs/bubble_version_2.shen +22 -22
  34. data/shen/release/test_programs/calculator.shen +21 -21
  35. data/shen/release/test_programs/cartprod.shen +23 -23
  36. data/shen/release/test_programs/change.shen +25 -25
  37. data/shen/release/test_programs/classes-defaults.shen +94 -94
  38. data/shen/release/test_programs/classes-inheritance.shen +100 -100
  39. data/shen/release/test_programs/classes-typed.shen +74 -74
  40. data/shen/release/test_programs/classes-untyped.shen +46 -46
  41. data/shen/release/test_programs/depth_.shen +14 -14
  42. data/shen/release/test_programs/einstein.shen +34 -34
  43. data/shen/release/test_programs/fruit_machine.shen +46 -46
  44. data/shen/release/test_programs/interpreter.shen +217 -217
  45. data/shen/release/test_programs/metaprog.shen +85 -85
  46. data/shen/release/test_programs/minim.shen +192 -192
  47. data/shen/release/test_programs/mutual.shen +11 -11
  48. data/shen/release/test_programs/n_queens.shen +45 -45
  49. data/shen/release/test_programs/newton_version_1.shen +33 -33
  50. data/shen/release/test_programs/newton_version_2.shen +24 -24
  51. data/shen/release/test_programs/parse.prl +14 -14
  52. data/shen/release/test_programs/parser.shen +51 -51
  53. data/shen/release/test_programs/powerset.shen +10 -10
  54. data/shen/release/test_programs/prime.shen +10 -10
  55. data/shen/release/test_programs/prolog.shen +78 -78
  56. data/shen/release/test_programs/proof_assistant.shen +80 -80
  57. data/shen/release/test_programs/proplog_version_1.shen +25 -25
  58. data/shen/release/test_programs/proplog_version_2.shen +27 -27
  59. data/shen/release/test_programs/qmachine.shen +66 -66
  60. data/shen/release/test_programs/red-black.shen +54 -54
  61. data/shen/release/test_programs/search.shen +55 -55
  62. data/shen/release/test_programs/semantic_net.shen +44 -44
  63. data/shen/release/test_programs/spreadsheet.shen +34 -34
  64. data/shen/release/test_programs/stack.shen +27 -27
  65. data/shen/release/test_programs/streams.shen +20 -20
  66. data/shen/release/test_programs/strings.shen +57 -57
  67. data/shen/release/test_programs/structures-typed.shen +71 -71
  68. data/shen/release/test_programs/structures-untyped.shen +41 -41
  69. data/shen/release/test_programs/tests.shen +232 -232
  70. data/shen/release/test_programs/types.shen +11 -11
  71. data/shen/release/test_programs/whist.shen +239 -239
  72. data/shen/release/test_programs/yacc.shen +132 -132
  73. metadata +21 -35
  74. data/shen/lib/shen_ruby/shen.rb +0 -160
  75. data/shen/license.txt +0 -34
  76. data/shen/release/benchmarks/N_queens.shen +0 -45
  77. data/shen/release/benchmarks/README.shen +0 -14
  78. data/shen/release/benchmarks/benchmarks.shen +0 -52
  79. data/shen/release/benchmarks/bigprog +0 -2173
  80. data/shen/release/benchmarks/einstein.shen +0 -33
  81. data/shen/release/benchmarks/heatwave.gif +0 -0
  82. data/shen/release/benchmarks/interpreter.shen +0 -219
  83. data/shen/release/benchmarks/jnk.shen +0 -194
  84. data/shen/release/benchmarks/picture.jpg +0 -0
  85. data/shen/release/benchmarks/plato.jpg +0 -0
  86. data/shen/release/benchmarks/powerset.shen +0 -10
  87. data/shen/release/benchmarks/prime.shen +0 -10
  88. data/shen/release/benchmarks/short.shen +0 -129
  89. data/shen/release/benchmarks/text.txt +0 -68
  90. data/shen/release/k_lambda/core.kl +0 -181
  91. data/shen/release/k_lambda/declarations.kl +0 -131
  92. data/shen/release/k_lambda/load.kl +0 -84
  93. data/shen/release/k_lambda/macros.kl +0 -112
  94. data/shen/release/k_lambda/prolog.kl +0 -252
  95. data/shen/release/k_lambda/reader.kl +0 -222
  96. data/shen/release/k_lambda/sequent.kl +0 -166
  97. data/shen/release/k_lambda/sys.kl +0 -271
  98. data/shen/release/k_lambda/t-star.kl +0 -139
  99. data/shen/release/k_lambda/toplevel.kl +0 -135
  100. data/shen/release/k_lambda/track.kl +0 -103
  101. data/shen/release/k_lambda/writer.kl +0 -105
  102. data/shen/release/k_lambda/yacc.kl +0 -113
@@ -1,11 +1,11 @@
1
- (define even?
2
- 1 -> false
3
- X -> (odd? (- X 1)))
4
-
5
- (define odd?
6
- 1 -> true
7
- X -> (even? (- X 1)))
8
-
9
-
10
-
11
-
1
+ (define even?
2
+ 1 -> false
3
+ X -> (odd? (- X 1)))
4
+
5
+ (define odd?
6
+ 1 -> true
7
+ X -> (even? (- X 1)))
8
+
9
+
10
+
11
+
@@ -1,45 +1,45 @@
1
- (define n-queens
2
- {number --> (list (list number))}
3
- N -> (n-queens-loop N (initialise N)))
4
-
5
- (define initialise
6
- {number --> (list number)}
7
- 0 -> []
8
- N -> [1 | (initialise (- N 1))])
9
-
10
- (define n-queens-loop
11
- {number --> (list number) --> (list (list number))}
12
- N Config -> [] where (all_Ns? N Config)
13
- N Config -> [Config | (n-queens-loop N (next_n N Config))]
14
- where (and (ok_row? Config) (ok_diag? Config))
15
- N Config -> (n-queens-loop N (next_n N Config)))
16
-
17
- (define all_Ns?
18
- {number --> (list number) --> boolean}
19
- _ [] -> true
20
- N [N | Ns] -> (all_Ns? N Ns)
21
- _ _ -> false)
22
-
23
- (define next_n
24
- {number --> (list number) --> (list number)}
25
- N [N | Ns] -> [1 | (next_n N Ns)]
26
- _ [N | Ns] -> [(+ 1 N) | Ns])
27
-
28
- (define ok_row?
29
- {(list number) --> boolean}
30
- [] -> true
31
- [N | Ns] -> false where (element? N Ns)
32
- [_ | Ns] -> (ok_row? Ns))
33
-
34
- (define ok_diag?
35
- {(list number) --> boolean}
36
- [] -> true
37
- [N | Ns] -> (and (ok_diag_N? (+ N 1) (- N 1) Ns)
38
- (ok_diag? Ns)))
39
-
40
- (define ok_diag_N?
41
- {number --> number --> (list number) --> boolean}
42
- _ _ [] -> true
43
- Up Down [Up | _] -> false
44
- Up Down [Down | _] -> false
45
- Up Down [_ | Ns] -> (ok_diag_N? (+ 1 Up) (- Down 1) Ns))
1
+ (define n-queens
2
+ {number --> (list (list number))}
3
+ N -> (n-queens-loop N (initialise N)))
4
+
5
+ (define initialise
6
+ {number --> (list number)}
7
+ 0 -> []
8
+ N -> [1 | (initialise (- N 1))])
9
+
10
+ (define n-queens-loop
11
+ {number --> (list number) --> (list (list number))}
12
+ N Config -> [] where (all_Ns? N Config)
13
+ N Config -> [Config | (n-queens-loop N (next_n N Config))]
14
+ where (and (ok_row? Config) (ok_diag? Config))
15
+ N Config -> (n-queens-loop N (next_n N Config)))
16
+
17
+ (define all_Ns?
18
+ {number --> (list number) --> boolean}
19
+ _ [] -> true
20
+ N [N | Ns] -> (all_Ns? N Ns)
21
+ _ _ -> false)
22
+
23
+ (define next_n
24
+ {number --> (list number) --> (list number)}
25
+ N [N | Ns] -> [1 | (next_n N Ns)]
26
+ _ [N | Ns] -> [(+ 1 N) | Ns])
27
+
28
+ (define ok_row?
29
+ {(list number) --> boolean}
30
+ [] -> true
31
+ [N | Ns] -> false where (element? N Ns)
32
+ [_ | Ns] -> (ok_row? Ns))
33
+
34
+ (define ok_diag?
35
+ {(list number) --> boolean}
36
+ [] -> true
37
+ [N | Ns] -> (and (ok_diag_N? (+ N 1) (- N 1) Ns)
38
+ (ok_diag? Ns)))
39
+
40
+ (define ok_diag_N?
41
+ {number --> number --> (list number) --> boolean}
42
+ _ _ [] -> true
43
+ Up Down [Up | _] -> false
44
+ Up Down [Down | _] -> false
45
+ Up Down [_ | Ns] -> (ok_diag_N? (+ 1 Up) (- Down 1) Ns))
@@ -1,33 +1,33 @@
1
- (define newtons-method
2
- N -> (let Guess (/ N 2.0)
3
- (run-newtons-method
4
- N
5
- (round-to-2-places (average Guess (/ N Guess)))
6
- Guess)))
7
-
8
- (define run-newtons-method
9
- _ Sqrt Sqrt -> Sqrt
10
- N Better_Guess _
11
- -> (run-newtons-method
12
- N
13
- (round-to-2-places (average Better_Guess (/ N Better_Guess)))
14
- Better_Guess))
15
-
16
- (define round-to-2-places
17
- N -> (/ (round (* 100.0 N)) 100.0))
18
-
19
- (define average
20
- M N -> (/ (+ M N) 2.0))
21
-
22
-
23
-
24
-
25
-
26
-
27
-
28
-
29
-
30
-
31
-
32
-
33
-
1
+ (define newtons-method
2
+ N -> (let Guess (/ N 2.0)
3
+ (run-newtons-method
4
+ N
5
+ (round-to-2-places (average Guess (/ N Guess)))
6
+ Guess)))
7
+
8
+ (define run-newtons-method
9
+ _ Sqrt Sqrt -> Sqrt
10
+ N Better_Guess _
11
+ -> (run-newtons-method
12
+ N
13
+ (round-to-2-places (average Better_Guess (/ N Better_Guess)))
14
+ Better_Guess))
15
+
16
+ (define round-to-2-places
17
+ N -> (/ (round (* 100.0 N)) 100.0))
18
+
19
+ (define average
20
+ M N -> (/ (+ M N) 2.0))
21
+
22
+
23
+
24
+
25
+
26
+
27
+
28
+
29
+
30
+
31
+
32
+
33
+
@@ -1,24 +1,24 @@
1
- (define newtons-method
2
- N -> (fix (/. M (specialised-run-newtons-method N M)) (/ N 2.0)))
3
-
4
- (define specialised-run-newtons-method
5
- M N -> (round-to-2-places (average N (/ M N))))
6
-
7
- (define round-to-2-places
8
- M -> (/ (round (* 100.0 M)) 100.0))
9
-
10
- (define average
11
- M N -> (/ (+ M N) 2.0))
12
-
13
-
14
-
15
-
16
-
17
-
18
-
19
-
20
-
21
-
22
-
23
-
24
-
1
+ (define newtons-method
2
+ N -> (fix (/. M (specialised-run-newtons-method N M)) (/ N 2.0)))
3
+
4
+ (define specialised-run-newtons-method
5
+ M N -> (round-to-2-places (average N (/ M N))))
6
+
7
+ (define round-to-2-places
8
+ M -> (/ (round (* 100.0 M)) 100.0))
9
+
10
+ (define average
11
+ M N -> (/ (+ M N) 2.0))
12
+
13
+
14
+
15
+
16
+
17
+
18
+
19
+
20
+
21
+
22
+
23
+
24
+
@@ -1,14 +1,14 @@
1
- (defprolog pparse
2
- S Grammar <-- (parsing [[s + 0] = [S + 0]] Grammar);)
3
-
4
- (defprolog parsing
5
- [X = X] _ <--;
6
- [[X + Y] = [X + Z]] Grammar <-- ! (parsing [Y = Z] Grammar);
7
- [[[X + Y] + Z] = W] Grammar <-- ! (parsing [[X + [Y + Z]] = W] Grammar);
8
- [W = [[X + Y] + Z]] Grammar <-- ! (parsing [W = [X + [Y + Z]]] Grammar);
9
- [[X + Y] = Z] Grammar <-- (member [X = W] Grammar) (parsing [[W + Y] = Z] Grammar);)
10
-
11
- (defprolog member
12
- X [X | _] <--;
13
- X [_ | Y] <-- (member X Y);)
14
-
1
+ (defprolog pparse
2
+ S Grammar <-- (parsing [[s + 0] = [S + 0]] Grammar);)
3
+
4
+ (defprolog parsing
5
+ [X = X] _ <--;
6
+ [[X + Y] = [X + Z]] Grammar <-- ! (parsing [Y = Z] Grammar);
7
+ [[[X + Y] + Z] = W] Grammar <-- ! (parsing [[X + [Y + Z]] = W] Grammar);
8
+ [W = [[X + Y] + Z]] Grammar <-- ! (parsing [W = [X + [Y + Z]]] Grammar);
9
+ [[X + Y] = Z] Grammar <-- (member [X = W] Grammar) (parsing [[W + Y] = Z] Grammar);)
10
+
11
+ (defprolog member
12
+ X [X | _] <--;
13
+ X [_ | Y] <-- (member X Y);)
14
+
@@ -1,52 +1,52 @@
1
- (define parse
2
- Sentence -> (let Parse (sent [Sentence []])
3
- (if (parsed? Parse)
4
- (output_parse Parse)
5
- ungrammatical)))
6
-
7
- (define parsed?
8
- [[] _] -> true
9
- _ -> false)
10
-
11
- (define output_parse
12
- [_ Parse_Rules] -> (reverse Parse_Rules))
13
-
14
- (define sent
15
- [Input Output] <- (vp (np [Input [[sent --> np vp] | Output]]))
16
- _ -> (fail))
17
-
18
- (define np
19
- [Input Output] <- (n (det [Input [[np --> det n] | Output]]))
20
- [Input Output] <- (name [Input [[np --> name] | Output]])
21
- _ -> (fail))
22
-
23
- (define name
24
- [["John" | Input] Output] -> [Input [[name --> "John"] | Output]]
25
- [["Bill" | Input] Output] -> [Input [[name --> "Bill"] | Output]]
26
- _ -> (fail))
27
-
28
- (define det
29
- [["the" | Input] Output] -> [Input [[det --> "the"] | Output]]
30
- [["a" | Input] Output] -> [Input [[det --> "a"] | Output]]
31
- [["that" | Input] Output] -> [Input [[det --> "that"] | Output]]
32
- [["this" | Input] Output] -> [Input [[det --> "this"] | Output]]
33
- _ -> (fail))
34
-
35
- (define n
36
- [["boy" | Input] Output] -> [Input [[n --> "boy"] | Output]]
37
- [["girl" | Input] Output] -> [Input [[n --> "girl"] | Output]]
38
- _ -> (fail))
39
-
40
- (define vp
41
- [Input Output] <- (np (vtrans [Input [[vp --> vtrans np] | Output]]))
42
- [Input Output] <- (vp [Input [[vp --> vintrans] | Output]])
43
- _ -> (fail))
44
-
45
- (define vtrans
46
- [["kicks" | Input] Output] -> [Input [[vtrans --> "kicks"] | Output]]
47
- [["likes" | Input] Output] -> [Input [[vtrans --> "likes"] | Output]]
48
- _ -> (fail))
49
-
50
- (define vintrans
51
- [["jumps" | Input] Output] -> [Input [[vintrans --> "jumps"] | Output]]
1
+ (define parse
2
+ Sentence -> (let Parse (sent [Sentence []])
3
+ (if (parsed? Parse)
4
+ (output_parse Parse)
5
+ ungrammatical)))
6
+
7
+ (define parsed?
8
+ [[] _] -> true
9
+ _ -> false)
10
+
11
+ (define output_parse
12
+ [_ Parse_Rules] -> (reverse Parse_Rules))
13
+
14
+ (define sent
15
+ [Input Output] <- (vp (np [Input [[sent --> np vp] | Output]]))
16
+ _ -> (fail))
17
+
18
+ (define np
19
+ [Input Output] <- (n (det [Input [[np --> det n] | Output]]))
20
+ [Input Output] <- (name [Input [[np --> name] | Output]])
21
+ _ -> (fail))
22
+
23
+ (define name
24
+ [["John" | Input] Output] -> [Input [[name --> "John"] | Output]]
25
+ [["Bill" | Input] Output] -> [Input [[name --> "Bill"] | Output]]
26
+ _ -> (fail))
27
+
28
+ (define det
29
+ [["the" | Input] Output] -> [Input [[det --> "the"] | Output]]
30
+ [["a" | Input] Output] -> [Input [[det --> "a"] | Output]]
31
+ [["that" | Input] Output] -> [Input [[det --> "that"] | Output]]
32
+ [["this" | Input] Output] -> [Input [[det --> "this"] | Output]]
33
+ _ -> (fail))
34
+
35
+ (define n
36
+ [["boy" | Input] Output] -> [Input [[n --> "boy"] | Output]]
37
+ [["girl" | Input] Output] -> [Input [[n --> "girl"] | Output]]
38
+ _ -> (fail))
39
+
40
+ (define vp
41
+ [Input Output] <- (np (vtrans [Input [[vp --> vtrans np] | Output]]))
42
+ [Input Output] <- (vp [Input [[vp --> vintrans] | Output]])
43
+ _ -> (fail))
44
+
45
+ (define vtrans
46
+ [["kicks" | Input] Output] -> [Input [[vtrans --> "kicks"] | Output]]
47
+ [["likes" | Input] Output] -> [Input [[vtrans --> "likes"] | Output]]
48
+ _ -> (fail))
49
+
50
+ (define vintrans
51
+ [["jumps" | Input] Output] -> [Input [[vintrans --> "jumps"] | Output]]
52
52
  _ -> (fail))
@@ -1,10 +1,10 @@
1
- (define powerset
2
- [] -> [[]]
3
- [X | Y] -> (let Powerset (powerset Y)
4
- (append (cons-X-to-each-set X Powerset) Powerset)))
5
-
6
- (define cons-X-to-each-set
7
- _ [ ] -> [ ]
8
- X [Y | Z] -> [[X | Y] | (cons-X-to-each-set X Z)])
9
-
10
-
1
+ (define powerset
2
+ [] -> [[]]
3
+ [X | Y] -> (let Powerset (powerset Y)
4
+ (append (cons-X-to-each-set X Powerset) Powerset)))
5
+
6
+ (define cons-X-to-each-set
7
+ _ [ ] -> [ ]
8
+ X [Y | Z] -> [[X | Y] | (cons-X-to-each-set X Z)])
9
+
10
+
@@ -1,10 +1,10 @@
1
- (define prime?
2
- X -> (prime* X (/ X 2) 2))
3
-
4
- (define prime*
5
- X Max Div -> false where (integer? (/ X Div))
6
- X Max Div -> true where (> Div Max)
7
- X Max Div -> (prime* X Max (+ 1 Div)))
8
-
9
-
10
-
1
+ (define prime?
2
+ X -> (prime* X (/ X 2) 2))
3
+
4
+ (define prime*
5
+ X Max Div -> false where (integer? (/ X Div))
6
+ X Max Div -> true where (> Div Max)
7
+ X Max Div -> (prime* X Max (+ 1 Div)))
8
+
9
+
10
+
@@ -1,79 +1,79 @@
1
- (defprolog f
2
- a <--;)
3
-
4
- (defprolog g
5
- a <-- ! (f b);
6
- X <-- (f a);)
7
-
8
- (defprolog mem
9
- X [X | _] <--;
10
- X [Y | Z] <-- (mem X Z);)
11
-
12
- (defprolog app
13
- [] X X <--;
14
- [X | Y] W [X | Z] <-- (app Y W Z);)
15
-
16
- (defprolog rev
17
- [] [] <--;
18
- [X | Y] Z <-- (rev Y W) (app W [X] Z);)
19
-
20
- (defprolog enjoys
21
- willi X <-- (likes mark X);
22
- mark chocolate <--;
23
- mark tea <--;) enjoys
24
-
25
- (defprolog fads
26
- X <-- (findall Y [enjoys X Y] Friends) (return Friends);) fads
27
-
28
- (defprolog prop
29
- A C <-- (proph [[~ C] | A]);) prop
30
-
31
- (defprolog proph
32
- A <-- (mem [~ P] A) (mem P A) !;
33
- A <-- (consistent A) ! (when false);
34
- (mode [[P & Q] | A] -) <-- ! (proph [P Q | A]);
35
- (mode [[P <=> Q] | A] -) <-- ! (proph [[P => Q] [Q => P] | A]);
36
- (mode [[P => Q] | A] -) <-- ! (proph [[[~ P] v Q] | A]);
37
- (mode [[~ [P v Q]] | A] -) <-- ! (proph [[~ P] [~ Q] | A]);
38
- (mode [[~ [P & Q]] | A] -) <-- ! (proph [[[~ P] v [~ Q]] | A]);
39
- (mode [[~ [P => Q]] | A] -) <-- ! (proph [P [~ Q] | A]);
40
- (mode [[~ [P <=> Q]] | A] -) <-- ! (proph [[~ [[P => Q] v [~ [Q => P]]]] | A]);
41
- (mode [[P & Q] | A] -) <-- ! (proph [P Q | A]);
42
- (mode [[P v Q] | A] -) <-- ! (proph [P | A]) ! (proph [Q | A]);
43
- (mode [P | Ps] -) <-- (app Ps [P] Qs) ! (proph Qs);)
44
-
45
- (defprolog consistent
46
- [] <--;
47
- [P | Ps] <-- (when (symbol? P)) ! (consistent Ps);
48
- [[~ P] | Ps] <-- (when (symbol? P)) ! (consistent Ps);)
49
-
50
- (defprolog app
51
- [] X X <--;
52
- (mode [X | Y] -) W [X | Z] <-- (app Y W Z);)
53
-
54
- (defprolog mem
55
- X (mode [X | _] -) <--;
56
- X (mode [_ | Y] -) <-- (mem X Y);)
57
-
58
- (defprolog mapit
59
- _ [] [] <--;
60
- Pred [X | Y] [W | Z] <-- (call [Pred X W]) (mapit Pred Y Z);)
61
-
62
- (defprolog consit
63
- X [1 X] <--;)
64
-
65
- (defprolog different
66
- X Y <-- (~ [identical X Y]);)
67
-
68
- (defprolog ~
69
- P <-- (call P) ! (when false);
70
- _ <--;)
71
-
72
- (defprolog likes
73
- john X <-- (tall X) (pretty X);)
74
-
75
- (defprolog tall
76
- mary <--;)
77
-
78
- (defprolog pretty
1
+ (defprolog f
2
+ a <--;)
3
+
4
+ (defprolog g
5
+ a <-- ! (f b);
6
+ X <-- (f a);)
7
+
8
+ (defprolog mem
9
+ X [X | _] <--;
10
+ X [Y | Z] <-- (mem X Z);)
11
+
12
+ (defprolog app
13
+ [] X X <--;
14
+ [X | Y] W [X | Z] <-- (app Y W Z);)
15
+
16
+ (defprolog rev
17
+ [] [] <--;
18
+ [X | Y] Z <-- (rev Y W) (app W [X] Z);)
19
+
20
+ (defprolog enjoys
21
+ willi X <-- (likes mark X);
22
+ mark chocolate <--;
23
+ mark tea <--;) enjoys
24
+
25
+ (defprolog fads
26
+ X <-- (findall Y [enjoys X Y] Friends) (return Friends);) fads
27
+
28
+ (defprolog prop
29
+ A C <-- (proph [[~ C] | A]);) prop
30
+
31
+ (defprolog proph
32
+ A <-- (mem [~ P] A) (mem P A) !;
33
+ A <-- (consistent A) ! (when false);
34
+ (mode [[P & Q] | A] -) <-- ! (proph [P Q | A]);
35
+ (mode [[P <=> Q] | A] -) <-- ! (proph [[P => Q] [Q => P] | A]);
36
+ (mode [[P => Q] | A] -) <-- ! (proph [[[~ P] v Q] | A]);
37
+ (mode [[~ [P v Q]] | A] -) <-- ! (proph [[~ P] [~ Q] | A]);
38
+ (mode [[~ [P & Q]] | A] -) <-- ! (proph [[[~ P] v [~ Q]] | A]);
39
+ (mode [[~ [P => Q]] | A] -) <-- ! (proph [P [~ Q] | A]);
40
+ (mode [[~ [P <=> Q]] | A] -) <-- ! (proph [[~ [[P => Q] v [~ [Q => P]]]] | A]);
41
+ (mode [[P & Q] | A] -) <-- ! (proph [P Q | A]);
42
+ (mode [[P v Q] | A] -) <-- ! (proph [P | A]) ! (proph [Q | A]);
43
+ (mode [P | Ps] -) <-- (app Ps [P] Qs) ! (proph Qs);)
44
+
45
+ (defprolog consistent
46
+ [] <--;
47
+ [P | Ps] <-- (when (symbol? P)) ! (consistent Ps);
48
+ [[~ P] | Ps] <-- (when (symbol? P)) ! (consistent Ps);)
49
+
50
+ (defprolog app
51
+ [] X X <--;
52
+ (mode [X | Y] -) W [X | Z] <-- (app Y W Z);)
53
+
54
+ (defprolog mem
55
+ X (mode [X | _] -) <--;
56
+ X (mode [_ | Y] -) <-- (mem X Y);)
57
+
58
+ (defprolog mapit
59
+ _ [] [] <--;
60
+ Pred [X | Y] [W | Z] <-- (call [Pred X W]) (mapit Pred Y Z);)
61
+
62
+ (defprolog consit
63
+ X [1 X] <--;)
64
+
65
+ (defprolog different
66
+ X Y <-- (~ [identical X Y]);)
67
+
68
+ (defprolog ~
69
+ P <-- (call P) ! (when false);
70
+ _ <--;)
71
+
72
+ (defprolog likes
73
+ john X <-- (tall X) (pretty X);)
74
+
75
+ (defprolog tall
76
+ mary <--;)
77
+
78
+ (defprolog pretty
79
79
  mary <--;)