문제

접두사 표기법 산술 언어에 대한 파서를 만들었던 할당을 사용하고 있습니다.주어진 값 V에 대해 AST를 빌드하는 술어를 쓸 필요가 있습니다. V (즉, AST A가 평가 될 때마다 값을 생성 할 때마다 V는 V는 v)입니다.내 생각은 충분히 간단했습니다.

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

EV는 평가 - 술어입니다.이것을 실행할 때 나는 ev-prorticate 의이 부분에 관한 제목에 오류를 얻는다 :

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

v와 n은 모두 바인드되지 않습니다.나는이 일을하는 또 다른 우아한 방법을 생각하는 것에 대해 고심하고 있으며, Prolog 가이 두 변수에 대한 정수를 생성 할 수있는 방법을 알고 있습니까?

이것이 이해할 수 있기를 바랍니다.)

도움이 되었습니까?

해결책

제기가 가능한 바에 따르면, 당신의 문제가 해결할 수없는 것처럼 보입니다. 그럼 나는 전체 문제에 다르게 접근하고, all 을 생성하는 것으로 생각합니다.

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의 입력의 길이는 올바른 재귀 적 비 터미널 SUM // 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