1

私はPrologを初めて使用し、電卓([three、times、two]、Total)を照会する問題があります。答えはTotal=6になります。

前の質問のフォローアップ:述語翻訳を使用して、[1,2,3,4など]が[1、2、3、4など]であることをPrologに理解させています。

translate([],[]).    
translate([H|T],[H2|T2]):-means(H,H2),translate(T,T2).
means(0,zero).
means(1,one).
means(2,two).
means(3,three).
means(4,four).
means(5,five).
means(6,six).
means(9,nine).
means(10,ten).

クエリを入力しました

?-translate([1,2,3,4]、X)。

X = [1、2、3、4]。

Prologは英語の数値を数値に変換しました。この翻訳を算術コードに組み込むのに助けが必要です。

calc([N1、times、N2]、Total):-合計はN1*N2です。

どんなアドバイスもいただければ幸いです。ありがとうございました。

4

2 に答える 2

2

答えを出すだけで助けられるかどうかはわかりませんが、最初の試みはDCGを使用することです。それらは、アトムのリストを含め、何でも解析するための非常に便利な方法です。例えば:

word_number(1) --> [one].
word_number(2) --> [two].

phrase/2これを次のように使用できます。

?- phrase(word_number(N), [one]).
N = 1 ;

ここで何が起こっているかというと、Prolog は入力シーケンスで一致する DCG ルールまたはリストを探しています。これらの DCG 式は、差分リストの上にある構文糖衣にすぎませんが、非常に宣言的な文法の読み取りを可能にします。それを拡張するには:

expression(Value) --> 
  word_number(Left), 
  [times], 
  word_number(Right),
  { Value is Left * Right }.

表記法自体以外の構文糖衣の他の部分は、-->任意の Prolog をブレースに埋め込むことができることです。他の DCG 述語を基本的に入力内の他のトークンとして使用しているため、word_number(Left)Left を単語の整数値にバインドしValue、左の単語数と右の積になります。

?- phrase(expression(Value), [two,times,two]).
Value = 4.

うまくいけば、これで十分に始めることができます。

編集

述語にtranslate/2組み込む必要がないことがわかりました。うまく機能します。calc/2means/2

calc([W1, times, W2], Total) :- 
  means(W1, N1), means(W2, N2),
  Total is N1*N2.
于 2013-02-06T05:02:23.520 に答える
1

数字をシンボルに割り当てるコンパクトな方法はnth0 /3 であり、それを「if」( (->) /2 を参照) と組み合わせることで、受け入れられる入力はシンボル数字にまたがることができます。

valof(V, U) :-
 nth0(U, [zero, one, two], V) -> true ; U = V.

それで、リストに適用する簡単な方法は次のようになります

calc([A, Op, B|Cs], R) :-
    valof(A, Va),
    valof(B, Vb),
    arith(Va, Op, Vb, T),
    calc([T|Cs], R).

編集再帰のベースを忘れました:

calc([A], R) :-
    valof(A, R).

arith(A, plus, B, R) :- R is A+B.
arith(A, mult, B, R) :- R is A*B.

3 つの要素をポップし、評価された値で置き換えることに注意してください(したがって、valof は数値を受け入れなければなりません)。

とは優先順位の異なるplus演算子 をわざと導入しました。上記の解決策は、算術式構文の重要なプロパティを処理していないため、正しくないことがわかります。この回答をダニエルが提供したもの(+1)とマージして、修正できるかどうかを確認し、同様の問題について私が与えた他の回答を確認してください。mult

于 2013-02-06T07:26:59.643 に答える