演習 (またはエントリ?) 57 では、ロジックがどのように流れるかを理解していません。問題は、次のことです。
(define teacupo
(lambda (x)
(conde
((= tea x ) #s)
((= cup x ) #s)
(else #u))))
ここで、'=' は実際には三重棒の統合 (?) 演算子です。以下を実行します。
(run* (r)
(fresh (x y)
(conde
((teacupo x) (= #t y) #s)
((= #f x) (= #t y))
(else #u)
(= (cons x (cons y ())) r)))
本は答えを与えます:
((tea #t) (cup #t) (#f #t))
私は答えが次のようになると思っていたでしょう:
(((tea cup) #t) (#f #t))
私の推論は、(teacupo x) の 'x' は、最初にすべてのソリューションを通過し、すべてのソリューションのリストに統合する必要があるということです。しかし、teacupo は一度に 1 つのソリューションしか放棄しないようです。conde の私の解釈では、それが与える規則を使用すると、conde の行を調べて、行が成功した後、失敗したふりをして、変数を更新し、成功する次の行を見つける必要があるため、混乱します。解決策が機能する方法を考えると、そのコードのコンデは成功した行に戻り、茶碗コンデを強制的に失敗させ、次の可能な値をあきらめるように見えます。繰り返しになりますが、teacupo ソリューションはリスト内のすべてのコンデ ソリューションを放棄し、外側のコンデ コールに進むと考えていました。