shen-ruby 0.10.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +1 -0
  3. data/.travis.yml +9 -3
  4. data/Gemfile +1 -4
  5. data/HISTORY.md +16 -0
  6. data/MIT_LICENSE.txt +1 -1
  7. data/README.md +25 -26
  8. data/Rakefile +3 -11
  9. data/bin/shen_test_suite.rb +15 -3
  10. data/bin/srrepl +6 -8
  11. data/lib/shen_ruby.rb +6 -1
  12. data/lib/shen_ruby/converters.rb +23 -0
  13. data/lib/shen_ruby/version.rb +1 -1
  14. data/shen-ruby.gemspec +4 -1
  15. data/shen/lib/shen_ruby/shen.rb +49 -33
  16. data/shen/release/benchmarks/N_queens.shen +45 -45
  17. data/shen/release/benchmarks/README.shen +14 -14
  18. data/shen/release/benchmarks/benchmarks.shen +52 -52
  19. data/shen/release/benchmarks/einstein.shen +32 -32
  20. data/shen/release/benchmarks/interpreter.shen +219 -219
  21. data/shen/release/benchmarks/jnk.shen +193 -193
  22. data/shen/release/benchmarks/powerset.shen +10 -10
  23. data/shen/release/benchmarks/prime.shen +10 -10
  24. data/shen/release/benchmarks/short.shen +129 -129
  25. data/shen/release/k_lambda/core.kl +181 -181
  26. data/shen/release/k_lambda/declarations.kl +131 -131
  27. data/shen/release/k_lambda/load.kl +84 -84
  28. data/shen/release/k_lambda/macros.kl +112 -112
  29. data/shen/release/k_lambda/prolog.kl +252 -252
  30. data/shen/release/k_lambda/reader.kl +222 -222
  31. data/shen/release/k_lambda/sequent.kl +166 -166
  32. data/shen/release/k_lambda/sys.kl +271 -271
  33. data/shen/release/k_lambda/t-star.kl +139 -139
  34. data/shen/release/k_lambda/toplevel.kl +135 -135
  35. data/shen/release/k_lambda/track.kl +103 -103
  36. data/shen/release/k_lambda/types.kl +324 -324
  37. data/shen/release/k_lambda/writer.kl +105 -105
  38. data/shen/release/k_lambda/yacc.kl +113 -113
  39. data/shen/release/test_programs/Chap13/problems.txt +26 -26
  40. data/shen/release/test_programs/README.shen +52 -52
  41. data/shen/release/test_programs/TinyLispFunctions.txt +15 -15
  42. data/shen/release/test_programs/TinyTypes.shen +55 -55
  43. data/shen/release/test_programs/binary.shen +24 -24
  44. data/shen/release/test_programs/bubble_version_1.shen +28 -28
  45. data/shen/release/test_programs/bubble_version_2.shen +22 -22
  46. data/shen/release/test_programs/calculator.shen +21 -21
  47. data/shen/release/test_programs/cartprod.shen +23 -23
  48. data/shen/release/test_programs/change.shen +25 -25
  49. data/shen/release/test_programs/classes-defaults.shen +94 -94
  50. data/shen/release/test_programs/classes-inheritance.shen +100 -100
  51. data/shen/release/test_programs/classes-typed.shen +74 -74
  52. data/shen/release/test_programs/classes-untyped.shen +46 -46
  53. data/shen/release/test_programs/depth_.shen +14 -14
  54. data/shen/release/test_programs/einstein.shen +34 -34
  55. data/shen/release/test_programs/fruit_machine.shen +46 -46
  56. data/shen/release/test_programs/interpreter.shen +217 -217
  57. data/shen/release/test_programs/metaprog.shen +85 -85
  58. data/shen/release/test_programs/minim.shen +192 -192
  59. data/shen/release/test_programs/mutual.shen +11 -11
  60. data/shen/release/test_programs/n_queens.shen +45 -45
  61. data/shen/release/test_programs/newton_version_1.shen +33 -33
  62. data/shen/release/test_programs/newton_version_2.shen +24 -24
  63. data/shen/release/test_programs/parse.prl +14 -14
  64. data/shen/release/test_programs/parser.shen +51 -51
  65. data/shen/release/test_programs/powerset.shen +10 -10
  66. data/shen/release/test_programs/prime.shen +10 -10
  67. data/shen/release/test_programs/prolog.shen +78 -78
  68. data/shen/release/test_programs/proof_assistant.shen +80 -80
  69. data/shen/release/test_programs/proplog_version_1.shen +25 -25
  70. data/shen/release/test_programs/proplog_version_2.shen +27 -27
  71. data/shen/release/test_programs/qmachine.shen +66 -66
  72. data/shen/release/test_programs/red-black.shen +54 -54
  73. data/shen/release/test_programs/search.shen +55 -55
  74. data/shen/release/test_programs/semantic_net.shen +44 -44
  75. data/shen/release/test_programs/spreadsheet.shen +34 -34
  76. data/shen/release/test_programs/stack.shen +27 -27
  77. data/shen/release/test_programs/streams.shen +20 -20
  78. data/shen/release/test_programs/strings.shen +57 -57
  79. data/shen/release/test_programs/structures-typed.shen +71 -71
  80. data/shen/release/test_programs/structures-untyped.shen +41 -41
  81. data/shen/release/test_programs/tests.shen +232 -232
  82. data/shen/release/test_programs/types.shen +11 -11
  83. data/shen/release/test_programs/whist.shen +239 -239
  84. data/shen/release/test_programs/yacc.shen +132 -132
  85. data/spec/shen_ruby/converters_spec.rb +48 -0
  86. data/spec/spec_helper.rb +1 -2
  87. metadata +55 -60
  88. data/k_lambda_spec/atom_spec.rb +0 -85
  89. data/k_lambda_spec/primitives/arithmetic_spec.rb +0 -175
  90. data/k_lambda_spec/primitives/assignments_spec.rb +0 -44
  91. data/k_lambda_spec/primitives/boolean_operations_spec.rb +0 -136
  92. data/k_lambda_spec/primitives/generic_functions_spec.rb +0 -120
  93. data/k_lambda_spec/primitives/lists_spec.rb +0 -40
  94. data/k_lambda_spec/primitives/strings_spec.rb +0 -77
  95. data/k_lambda_spec/primitives/symbols_spec.rb +0 -24
  96. data/k_lambda_spec/primitives/vectors_spec.rb +0 -92
  97. data/k_lambda_spec/spec_helper.rb +0 -29
  98. data/k_lambda_spec/support/shared_examples.rb +0 -124
  99. data/k_lambda_spec/tail_recursion_spec.rb +0 -30
  100. data/lib/kl.rb +0 -7
  101. data/lib/kl/absvector.rb +0 -12
  102. data/lib/kl/compiler.rb +0 -360
  103. data/lib/kl/cons.rb +0 -51
  104. data/lib/kl/empty_list.rb +0 -12
  105. data/lib/kl/environment.rb +0 -163
  106. data/lib/kl/error.rb +0 -4
  107. data/lib/kl/internal_error.rb +0 -7
  108. data/lib/kl/lexer.rb +0 -186
  109. data/lib/kl/primitives/arithmetic.rb +0 -60
  110. data/lib/kl/primitives/assignments.rb +0 -15
  111. data/lib/kl/primitives/booleans.rb +0 -21
  112. data/lib/kl/primitives/error_handling.rb +0 -13
  113. data/lib/kl/primitives/extensions.rb +0 -12
  114. data/lib/kl/primitives/generic_functions.rb +0 -29
  115. data/lib/kl/primitives/lists.rb +0 -23
  116. data/lib/kl/primitives/streams.rb +0 -28
  117. data/lib/kl/primitives/strings.rb +0 -63
  118. data/lib/kl/primitives/symbols.rb +0 -18
  119. data/lib/kl/primitives/time.rb +0 -17
  120. data/lib/kl/primitives/vectors.rb +0 -36
  121. data/lib/kl/reader.rb +0 -46
  122. data/spec/kl/cons_spec.rb +0 -12
  123. data/spec/kl/environment_spec.rb +0 -282
  124. data/spec/kl/interop_spec.rb +0 -68
  125. data/spec/kl/lexer_spec.rb +0 -149
  126. data/spec/kl/primitives/generic_functions_spec.rb +0 -29
  127. data/spec/kl/primitives/symbols_spec.rb +0 -21
  128. data/spec/kl/reader_spec.rb +0 -42
@@ -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 <--;)