我一直在努力解决问题
? − evalExp(exp(−, exp(∗, 3, 4), exp(/, 2, 3)), N ).
N = 11.333333333333334.
我的代码在Windows中工作,但在ubuntu中不起作用。这是我的代码。
evalExp(exp(X,L,R),N):-expr(exp(X,L,R),N).
expr(exp(-,L,R),N):-expr(L,N1),expr(R,N2),N is N1-N2.
expr(exp(+,L,R),N):-expr(L,N1),expr(R,N2),N is N1+N2.
expr(exp(*,L,R),N):-expr(L,N1),expr(R,N2),N is N1*N2.
expr(exp(/,L,R),N):-expr(L,N1),expr(R,N2),N is N1/N2.
expr(exp(**,L,0),N):-N=1.
expr(exp(**,L,R),N):-
expr(L,N1),expr(R,N2),P is N2-1,expr(exp(**,N1,P),N3),N is N1*N3.
expr(A,N):- N is A.
答案 0 :(得分:0)
我可以在代码中看到你的基本情况。你应该有一个代码来回溯。
答案 1 :(得分:0)
你的问题是你的最后一个条款,在回溯时会尝试评估表达式。 可以通过检查输入值(子句中的A)是否为数字来解决。所以最后一句应该是:
expr(N,N):- number(N).
子句中还有一个单例变量,用参数0处理**,它应该是:
expr(exp(**,_,0),N):-N=1.