トークンのリストの形式で数式を取り込んで T を見つける parse(Tkns, T) を記述し、演算の順序と結合性を考慮して、抽象構文を表すステートメントを返す必要があります。
例えば、
?- parse( [ num(3), plus, num(2), star, num(1) ], T ).
T = add(integer(3), multiply(integer(2), integer(1))) ;
No
+ と * を次のように実装しようとしました
parse([num(X)], integer(X)).
parse(Tkns, T) :-
( append(E1, [plus|E2], Tkns),
parse(E1, T1),
parse(E2, T2),
T = add(T1,T2)
; append(E1, [star|E2], Tkns),
parse(E1, T1),
parse(E2, T2),
T = multiply(T1,T2)
).
これは正しい答えを見つけますが、結合性や操作の順序に従わない答えも返します。
元)
parse( [ num(3), plus, num(2), star, num(1) ], T ).
も返す
mult(add(integer(3), integer(2)), integer(1))
と
parse([num(1), plus, num(2), plus, num(3)], T)
1+2+3 および 1+(2+3) と同等のものを返しますが、前者のみを返す必要があります。
これを機能させる方法はありますか?
編集: 詳細: +、-、*、/、negate (-1、-2 など) を実装するだけでよく、すべての数値は整数です。コードが文法と同様に構造化されるというヒントが与えられました
<expression> ::= <expression> + <term>
| <expression> - <term>
| <term>
<term> ::= <term> * <factor>
| <term> / <factor>
| <factor>
<factor> ::= num
| ( <expression> )
ネゲートも実装されている場合のみ。
Edit2: Prolog で書かれた文法パーサーを見つけました ( http://www.cs.sunysb.edu/~warren/xsbbook/node10.html )。文法の左手派生を出力するように変更する方法はありますか (Prolog インタープリターが「T=[正解]」を出力するという意味での「出力」)