質問

プレフィックス表記の算術言語のパーサーを作成した課題に取り組んでいます。任意の与えられた値vに対してASTを構築する述語を書く必要がある(aが評価されるときはaが値がvであるときにAST Aを生成する)。私の考えは十分に簡単でした:

genAst(Val, Env, Ast) :-
   ev(Ast, Env, Val).
.

ここで、EVは評価述語です。これを実行すると、EV述語のこの部分に関するタイトルのエラーが発生します。

ev(xer_(power(N)), Env, V) :-
   integer(N),
   V is Env^N. %THIS LINE
.

ここで、VとNの両方が結合していない。私はこれを行うために別のエレガントな方法を考えるのに苦労しています、誰かが私がこれら2つの変数のためのPrologを生成する方法を知っていますか?

私はこれが理解できることを願っています:)

役に立ちましたか?

解決

ポーズとして、あなたの問題は解決できないようです、それから私は全体の問題に異なる問題に近づくと思います。

genAst(Val, Env, Ast) :-
    length(Tokens, N),
    (N > 10, !, fail ; true),
    phrase(sum(Ast), Tokens),
    ev(Ast, Env, Val).

sum(sum(A,B)) --> [+], mul(A), sum(B).
sum(N) --> mul(N).

mul(mul(N,X)) --> [*], xer(X), num(N).
mul(N) --> xer(N).

xer(exp(x,N)) --> [^,x], num(N).
xer(var(x)) --> [x].
xer(N) --> num(N).

%num(num(X)) --> [X], {var(X) -> between(1,9,X) ; integer(X)}.
num(num(X)) --> [X], {X=2;X=3}.
.

収率

?- genAst(6,2,A).
A = sum(num(3), num(3)) ;
A = mul(num(3), var(x)) ;
A = mul(num(3), num(2)) ;
A = mul(num(2), num(3)) ;
A = sum(mul(num(2), var(x)), var(x)) ;
A = sum(mul(num(2), var(x)), num(2)) ;
A = sum(mul(num(2), num(2)), var(x)) ;
A = sum(mul(num(2), num(2)), num(2)) ;
A = sum(exp(x, num(2)), var(x)) ;
A = sum(exp(x, num(2)), num(2)) ;
A = sum(var(x), sum(var(x), var(x))) ;
A = sum(var(x), sum(var(x), num(2))) ;
A = sum(var(x), sum(num(2), var(x))) ;
A = sum(var(x), sum(num(2), num(2))) ;
A = sum(var(x), mul(num(2), var(x))) ;
A = sum(var(x), mul(num(2), num(2))) ;
A = sum(var(x), exp(x, num(2))) ;
A = sum(num(2), sum(var(x), var(x))) ;
A = sum(num(2), sum(var(x), num(2))) ;
A = sum(num(2), sum(num(2), var(x))) ;
A = sum(num(2), sum(num(2), num(2))) ;
A = sum(num(2), mul(num(2), var(x))) ;
A = sum(num(2), mul(num(2), num(2))) ;
A = sum(num(2), exp(x, num(2))) ;
false.
.

このDCGの入力の長さを制限することは、右再帰的な非ターミナル和// 1

のために必要です。

他のヒント

library(clpfd) 。それはそのような機能を正確に含みます。そしてあなたがそれらを必要としない限り、具体的な値を生成する必要はありません!

?- X #= Y^Z.
Y^Z#=X.

?- X #= Y^Z, [Y,Z]ins 1..3.
 Y^Z#=X,
Y in 1..3,
Z in 1..3.

?- X #= Y^Z, [Y,Z]ins 1..3, labeling([], [Y,Z]).
X = Y, Y = Z, Z = 1 ;
X = Y, Y = 1,
Z = 2 ;
X = Y, Y = 1,
Z = 3 ;
X = Y, Y = 2,
Z = 1 ;
X = 4,
Y = Z, Z = 2 ;
X = 8,
Y = 2,
Z = 3 ;
X = Y, Y = 3,
Z = 1 ;
X = 9,
Y = 3,
Z = 2 ;
X = 27,
Y = Z, Z = 3.
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top