問題4-61〜62

「プログラムとしての論理」というトピックに取り組んでいます。規則を用いて、論理的推論を実行させるようなプログラムが紹介されています。
問題4-61。与えられたリストの中の隣同士の要素を見つけるnext-toについて考えます。(?x next-to ?y in ?list)という形式で、?の部分に何らかの値を入れると、他の値が論理的に推論されて、その結果が表示されます。ruleを見てみると、?listの最初の二つが?xと?yであり、かつ、?listを再帰的に最初の要素と他の要素に分離出来ると定義されています。そのため、

(?x next-to ?y in (1 (2 3) 4))
->(1 next-to (2 3) in (1 (2 3) 4))
->((2 3) next-to 4 in (1 (2 3) 4))
->(4 next-to '() in (1 (2 3) 4))

になるのではないかと思われます。(2 3)が隣同士であるという答えが出てくるかというと、それをやるようには思えなかったので、ここからは外しました。次は、

(?x next-to 1 in (2 1 3 1))
->(2 next-to 1 in (2 1 3 1))
->(3 next-to 1 in (2 1 3 1))

になるのではないでしょうか。
問題4-62。last-pairの規則を定義します。listの最後の要素を導きだすということで、next-toを使って、'()と隣同士であるような要素が最後の要素だという規則を作ってやればよさそうです。

(rule (last-pair ?list ?x)
      (?x next-to '() in ?list))

そうすると、

(last-pair (3) ?x)
->3
(last-pair (1 2 3) ?x)
->3
(last-pair (2 ?x) (3))
->3

という推論結果が導かれます。また、(last-pair ?x (3))と質問してしまうと、3を最後の要素とした特定不能なリストが?xであるという解答になってしまい、無限ループに陥ってしまうのではないかと思われます。
問題4-63は飛ばしました。