2

Scheme のパターンを使用して検索する方法を探しています。のように、検索パターンがある場合

'((x likes  y) (y is a hard sport) (x is rich)) 

と入力

'((Mike likes rugby) (Rachel likes tennis) 
  (rugby is a hard sport ) ( tennis is easy)
  (Mike is rich) (Rachel is rich)) 

すべての制限の資格があるのはマイクだけなので、マイクだけを取得する必要があります。

私は何時間もこれをやろうとしてきました。最初に x を Mike にバインドしてから、 x の代わりに Mike をどこでも使用しようとしました。問題は、私が持っている変数の数がわからないことです.これを行う方法はありますか、それとも私の考えは完全に間違っていますか?

4

2 に答える 2

4

不明な数の変数が必要な場合は、名前と値のバインディングを格納するために連想リストまたはハッシュ テーブルを使用します。Scheme には、両方のデータ構造を処理するための組み込みプロシージャが用意されています。

問題の説明と必要なマッチングの種類は、Prologや同様の論理プログラミングシステムの仕事によく似ています。Scheme の使用に行き詰まっている場合は、 ( SICPに示されているように)統合アルゴリズムを実装するか、たとえばKANRENminiKANRENなど、Scheme に組み込まれた論理プログラミング システムを使用することを検討してください。また、参照用にThe Reasoned Schemerも参照してください。

于 2013-03-18T18:49:51.093 に答える
2

ここでやろうとしているのは、かなり古典的な論理プログラミングです。私がSchemeに常に使用しているアプローチは、amb演算子のバリエーションです。

ambこのように動作します:

(let ((x (amb 1 2 3 4))
      (y (amb 5 6 7 8))
   (rule (= 10 (+ x y))
   (list x y))

これにより、合計が10になるようにいくつかが返されx yます。これと他の魔術を使用して、システムを作成できます。

まず、パターンが私たちの「ルール」になります。したがって、パターンを次のようにフォーマットするとします。

'((list-of-vars) (rule 1) (rule 2) (rule 3))

ここで、入力データについて、次のように構成されているとしましょう。

'((list-of-values) (fact 1) (fact 2) (fact 3))

今、私たちの生活はとても簡単になりました。私たちは、スキームのマクロ/手順/魔術に次のようなことをさせたいだけです。

(define-syntax resolve
  (syntax-rules ()
    [(_ ((v1 vs ...)
         r1 rs ...)
        ((ps ...)
     f1 fs ...))
     (let* ((v1 (amb ps ...))
           (vs (amb ps ...))
           ...
           (sym-table (list (cons (quote v1) v1)
                            (cons (quote vs) vs)
                        ...))
           (facts '(f1 fs ...))
           (rules '(r1 rs ...)))
       (map rule (map
                  (lambda (rule)
                    (member (substitute rule sym-table)
                            facts))
                  rules))
       sym-table)]))

要旨の完全なコード

うまくいけば、これがあなたに出発点を与えるでしょう、あなたがどんな質問をするか私に知らせてください。

于 2013-03-18T17:58:33.780 に答える