2016-12-11 12 views
0

私は式から記号を抽出しようとしています。例:私はこれまで何をやったか与えられた式から記号を抽出する

?- formula((p v q) & (q v r), U). 

U = [p, q, v]. 

は:

simbol_formula([],[]). 
simbol_formula(negation X, [X]). 
simbol_formula(X or Y, [X,Y]). 
simbol_formula(X and Y, [X,Y]). 

私は私がやったことは正しいが、不完全であると考えています。ハマった。明らかに単純な式では機能しますが、より複雑な式では機能しません。私はsimbol_formula(F,U) :-と何かを定義しなければならないことを知っています。何らかの形で再帰を使用するか、または指定された数式を「より小さい」数式に分割します。

答えて

1

あなたの場合のコアの問題は、defaultyデータ構造の使用です。あなたの表現で

、あなたは、一人でをマッチングパターンによって、区別することはできません。

  • シンボル
  • 数式を。

この欠点を克服するために、私は(任意)ファンクター  s/1シンボルを一意にマークすることをお勧め。

例えば、式(p v q) & (q v r)のように表現される:

 
symbols(s(X))  --> [X]. 
symbols(negation(F)) --> symbols(F). 
symbols(X ∨ Y)  --> symbols(X), symbols(Y). 
symbols(X & Y)  --> symbols(X), symbols(Y). 

:次に、我々はDCGを使用することができ

 
(s(p) ∨ s(q)) & (s(q) ∨ s(r)) 

シンボルに式を関連付けますサンプルクエリ:

 
?- phrase(symbols((s(p) ∨ s(q)) & (s(q) ∨ s(r))), Ls). 
Ls = [p, q, q, r]. 

オペレータを練習として定義したまま、上記のようにコンパイルします。

上記も不当にもかかわらず、式を列挙に使用することができる。

 
?- phrase(symbols(Formula), Ls). 
Formula = s(_G1010), 
Ls = [_G1010] ; 
Formula = negation(s(_G1012)), 
Ls = [_G1012] ; 
Formula = negation(negation(s(_G1014))), 
Ls = [_G1014] . 
関連する問題