2016-12-17 9 views
1

私はこのようになりますPrologの句を持っている:句の本文をリストに変換するには?

私はこのようなリスト(L言う)に変換したい
inorder :- true(cell(1, 1, 1)), true(cell(1, 2, 2)), true(cell(1, 3, 3)), 
      true(cell(2, 1, 4)), true(cell(2, 2, 5)), true(cell(2, 3, 6)), 
      true(cell(3, 1, 7)), true(cell(3, 2, 8)), true(cell(3, 3, b)). 

L = [cell(1, 1, 1), cell(1, 2, 2), cell(1, 3, 3), 
    cell(2, 1, 4), cell(2, 2, 5), cell(2, 3, 6), 
    cell(3, 1, 7), cell(3, 2, 8), cell(3, 3, b)]. 

開始する明白な方法はそうされるように:

clause(inorder, Body). 

しかし、それが生成します。

Body = (true(cell(1, 1, 1)), true(cell(1, 2, 2)), true(cell(1, 3, 3)), true(cell(2, 1, 4)), true(cell(2, 2, 5)), true(cell(2, 3, 6)), true(cell(3, 1, 7)), true(cell(..., ..., ...)), true(cell(..., ..., ...))). 

私は "trues"をどのように抽出するのか本当にわからないのですか? Prologの専門家からの提案はありますか?

答えて

3

私はあなたがそのようなinorderためのあなたが持っているものとして構造を持っているでしょうか、なぜあなたはファンクタとして予約Prologの単語trueを再利用しますが、あなたはこのようにそれを打破することができる理由はわからない:

clause_body_list(Clause, Body) :- 
    clause(Clause, Elements), 
    clause_body_list_aux(Elements, Body). 

clause_body_list_aux(Elements, [BodyPart|BodyRest]) :- 
    Elements =.. [_, E | T], 
    ( T = [] 
    -> BodyPart = E, 
     BodyRest = [] 
    ; [ClauseRest] = T, 
     true(BodyPart) = E, 
     clause_body_list_aux(ClauseRest, BodyRest) 
    ). 

もっと大きな文脈では、あなたがやっていることを達成するより賢明な方法があると思います。

+1

ありがとうリードオンリーメンバー、同様に行うことができます。不自然なコードの理由は、http://www.ggp.org/(私がスタンフォードの論理学者Michael Geneserethが提供するオンラインコースを通じて発見した本当に楽しい話題)で説明されているように、一般的なゲームプレイのためのPrologプレーヤーを書くことです。私が使用している例は、GGPの8つのパズルからです。ルールはGGP(幸いなことにPrologの方言)に書かれていて、本当の(ベース)を使っているかどうかについては何も言いません。 – joeblog

0

私はより一般的な解決策に、そして私の多分もっと初心者レベルのPrologにlurkerの答えを書き換えました。

トリックは、結果のリストの先頭に '、' = 'のような先を取り除くことです。

は、次に(ベース)、真から拠点のリストを抽出する働き

clause_body_list(inorder, List), findall(B, member(true(B), List), Bs), write(Bs). 
関連する問題