这是一个简单的Prolog程序,用于显示我目前使用真实代码的问题。
我正在尝试在Prolog中编写一个Brainf * ck解释器,但它没有返回正确的Output
我正在运行bf("+.", Output)
预期回报 - Output = [1]
实际回报 - Output = []
。
Output
在iterateProg(Prog,Output)
返回bf2
时失去其值。
计划如下:
bf2(Prog,Output):-
iterateProg(Prog,Output).
iterateProg([],_):- !.
iterateProg(Prog, Output):-
checkInstruction(Prog,Output, NewProg, NewOutput),
iterateProg(NewProg, NewOutput).
checkInstruction([Plus|ProgTail],Output,ProgTail,Output):-
char_code('+',Plus)
%increase memory by 1 for printing later.
.
checkInstruction([Period|ProgTail], Output, ProgTail, NewOutput):-
char_code('.',Period),
%take the value in memory from addition just now, we will assume it is 1
append(Output,[1],NewOutput).
答案 0 :(得分:1)
您的谓词bf2(Prog, Output)
具有以下含义:此计划Prog
与此输出Output
对应 - 因此Output
谓词中的bf2
以及iterateProg
应包含完整输出。
因此在checkInstruction
谓词中,前2个参数应包含完整程序和完整输出,后2个参数应包含部分程序和相应的部分输出。
因此,您应该将[1]
附加NewOutput
,以Output
为checkInstruction
谓词的第二个规则生成最终输出。您应该使用不同的名称重命名New...
- 因为它实际上是部分/“尾部”程序和相应的输出。
append([1], NewOutput, Output)
请注意订单(我在评论中不准确)。 [1]
是当前指令的输出,它应该在ProgTail
中的指令输出之前。
顺便说一下,bf2
谓词是不必要的 - 因为它用完全相同的参数调用iterateProg
谓词。
另一件事是iterateProg([],_)
应该是iterateProg([],[])
,因为空程序应该与空输出相对应。 (反之亦然,所以如果你已经了解它,你不应该在这里放一个切口!
。