Chapter 4, Metalinguistic Abstraction
Exercise 4.69
The interesting part of this exercise is that the first element in the conclusion of a rule which looked like a rule-name is just a member of the list to be matched against.
The code uses two rules find-son
and find-grandson
from in ex-4.63 and last-pair
from in ex-4.62
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
;;; Query input:
(assert! (rule ((grandson) ?g ?s) (find-grandson ?g ?s)))
Assertion added to data base.
;;; Query input:
(assert! (rule ((great . ?rel) ?gg ?s)
(and (find-son ?gg ?g)
(?rel ?g ?s)
(last-pair ?rel (grandson)))))
Assertion added to data base.
;;; Query input:
((great grandson) ?g ?ggs)
;;; Query results:
((great grandson) mehujael jubal)
((great grandson) irad lamech)
((great grandson) mehujael jabal)
((great grandson) enoch methushael)
((great grandson) cain mehujael)
((great grandson) adam irad)
;;; Query input:
(?relationship Adam Irad)
;;; Query results:
((great grandson) adam irad)
;;; Query input:
Output:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
;;; Query input:
((great grandson) ?g ?ggs)
;;; Query results:
((great grandson) mehujael jubal)
((great grandson) irad lamech)
((great grandson) mehujael jabal)
((great grandson) enoch methushael)
((great grandson) cain mehujael)
((great grandson) adam irad)
;;; Query input:
(?relationship Adam Irad)
;;; Query results:
((great grandson) adam irad)
;;; Query input: