我正在尝试在 Prolog 中运行以下程序。
mama_mia1(A,M,LI,HI,LO,HO,AA) :-
p1(A,M,LI,HI,LO,HO,PROGS),
reverse(PROGS,PROG),
atom_chars(AA,PROG),
!.
p1(_,_,LO,LO,LO,_,[]).
p1(_,_,HO,HO,_,HO,[]).
p1(_,_,LO,HO,LO,HO,[]).
p1(_,_,X,LO,LO,HO,[]) :- X>LO,X<HO.
p1(_,_,X,HO,LO,HO,[]) :- X>LO,X<HO.
p1(_,_,LO,Y,LO,HO,[]) :- Y>LO,Y<HO.
p1(_,_,HO,Y,LO,HO,[]) :- Y>LO,Y<HO.
p1(_,_,X,Y,LO,HO,[]) :- X>LO,X<HO,Y>LO,Y<HO.
p1(A,M,X,Y,LO,HO,PROG) :-
( (X1 is X+A, H1 is HO+1, X1<H1, Y1 is Y+A, Y1<H1 )
-> append(PROG1,['A'],PROG),
p1(A,M,X1,Y1,LO,HO,PROG1)
; false).
p1(A,M,X,Y,LO,HO,PROG) :-
( (X2 is X * M, H1 is HO+1, X2<H1, Y2 is Y * M, Y2<H1)
-> append(PROG2,['M'],PROG),
p1(A,M,X2,Y2,LO,HO,PROG2)
; false).
程序应计算从 li 和 hi 之间的每个数字到 lo 和 ho 之间的结果的适当的加法和乘法路径。加法对应字母 A,乘法对应 M。在程序结束时,我们应该得到对应于我们找到的路径的 As 和 Ms 字符串。
该程序运行良好,但在尝试测试用例时:
mama_mia1(70000,17,2,5,89000,89900,P)
我收到“错误:超出全局堆栈”消息。
任何想法代码有什么问题?