Как поставлено, ваша проблема кажется неразрешимой, тогда я думаю, что подошел бы ко всей проблеме по-другому, создав все AST до максимального количества токенов.
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
person
CapelliC
schedule
18.11.2013
is
. Слева должна быть одна несвязанная переменная, а справа должны быть все связанные переменные. Пролог не будет перечислять возможные решения выраженияis/2
. - person lurker   schedule 18.11.2013var/1
илиnonvar/1
. - person lurker   schedule 18.11.2013=:=
требует, чтобы все было инстанцировано. Спрашивая4 =:= 2^X
, я предполагаю, что вы имеете в виду, что хотитеlog2(4)
. Таким образом, вы можете использоватьX is log10(4)/log10(2).
, а затем использовать свои интерпретаторы пролога и другие арифметические функции, чтобы определить, является ли это целым числом. Или, поскольку база равна2
, вы можете легко создать предикат, который выполняетlog2
, используя сдвиги. - person lurker   schedule 18.11.2013