@@ -9,6 +9,32 @@ infix fun Goal.and(other: Goal): Goal = { st: State -> this(st) bind other }
9
9
infix fun Goal .`|||` (other : Goal ): Goal = this or other
10
10
infix fun Goal .`&&&` (other : Goal ): Goal = this and other
11
11
12
+ /* *
13
+ * Calculates g1 ||| (g2 ||| (g3 ||| ... gn)) for a non-empty list of goals.
14
+ *
15
+ * NOTE: right association!
16
+ */
17
+ fun conde (vararg goals : Goal ): Goal {
18
+ require(goals.isNotEmpty()) {
19
+ " Expected at least one goal for conde but got 0"
20
+ }
21
+
22
+ return goals.reduceRight(Goal ::or )
23
+ }
24
+
25
+ /* *
26
+ * Calculates g1 &&& (g2 &&& (g3 &&& ... gn)) for a non-empty list of goals.
27
+ *
28
+ * NOTE: right association!
29
+ */
30
+ fun and (vararg goals : Goal ): Goal {
31
+ require(goals.isNotEmpty()) {
32
+ " Expected at least one goal for `and` but got 0"
33
+ }
34
+
35
+ return goals.reduceRight(Goal ::and )
36
+ }
37
+
12
38
/* *
13
39
* Creates a lazy [Goal] by passed goal generator [f].
14
40
*/
@@ -19,10 +45,34 @@ fun delay(f: () -> Goal): Goal = { st: State -> ThunkStream { f()(st) } }
19
45
*
20
46
* @see [delay], [State.freshTypedVar].
21
47
*/
22
- fun <T : Term <T >> freshTypedVar (f : (Term <T >) -> Goal ): Goal = delay {
48
+ fun <T : Term <T >> freshTypedVars (f : (Term <T >) -> Goal ): Goal = delay {
23
49
{ st: State -> f(st.freshTypedVar())(st) }
24
50
}
25
51
52
+ fun <T1 : Term <T1 >, T2 : Term <T2 >> freshTypedVars (f : (Term <T1 >, Term <T2 >) -> Goal ): Goal = delay {
53
+ { st: State -> f(st.freshTypedVar(), st.freshTypedVar())(st) }
54
+ }
55
+
56
+ fun <T1 : Term <T1 >, T2 : Term <T2 >, T3 : Term <T3 >> freshTypedVars (f : (Term <T1 >, Term <T2 >, Term <T3 >) -> Goal ): Goal = delay {
57
+ { st: State -> f(st.freshTypedVar(), st.freshTypedVar(), st.freshTypedVar())(st) }
58
+ }
59
+
60
+ fun <T1 : Term <T1 >, T2 : Term <T2 >, T3 : Term <T3 >, T4 : Term <T4 >> freshTypedVars (f : (Term <T1 >, Term <T2 >, Term <T3 >, Term <T4 >) -> Goal ): Goal = delay {
61
+ { st: State -> f(st.freshTypedVar(), st.freshTypedVar(), st.freshTypedVar(), st.freshTypedVar())(st) }
62
+ }
63
+
64
+ fun <T1 : Term <T1 >, T2 : Term <T2 >, T3 : Term <T3 >, T4 : Term <T4 >, T5 : Term <T5 >> freshTypedVars (f : (Term <T1 >, Term <T2 >, Term <T3 >, Term <T4 >, Term <T5 >) -> Goal ): Goal = delay {
65
+ { st: State -> f(st.freshTypedVar(), st.freshTypedVar(), st.freshTypedVar(), st.freshTypedVar(), st.freshTypedVar())(st) }
66
+ }
67
+
68
+ fun <T1 : Term <T1 >, T2 : Term <T2 >, T3 : Term <T3 >, T4 : Term <T4 >, T5 : Term <T5 >, T6 : Term <T6 >> freshTypedVars (f : (Term <T1 >, Term <T2 >, Term <T3 >, Term <T4 >, Term <T5 >, Term <T6 >) -> Goal ): Goal = delay {
69
+ { st: State -> f(st.freshTypedVar(), st.freshTypedVar(), st.freshTypedVar(), st.freshTypedVar(), st.freshTypedVar(), st.freshTypedVar())(st) }
70
+ }
71
+
72
+ fun <T1 : Term <T1 >, T2 : Term <T2 >, T3 : Term <T3 >, T4 : Term <T4 >, T5 : Term <T5 >, T6 : Term <T6 >, T7 : Term <T7 >> freshTypedVars (f : (Term <T1 >, Term <T2 >, Term <T3 >, Term <T4 >, Term <T5 >, Term <T6 >, Term <T7 >) -> Goal ): Goal = delay {
73
+ { st: State -> f(st.freshTypedVar(), st.freshTypedVar(), st.freshTypedVar(), st.freshTypedVar(), st.freshTypedVar(), st.freshTypedVar(), st.freshTypedVar())(st) }
74
+ }
75
+
26
76
/* *
27
77
* Represents an answer to evaluating the [run] expression. Contains reified [term], calculated by walking the term,
28
78
* passed to [run], with corresponding to calculated [Goal]s [Substitution]s,
0 commit comments