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: