4

这是一个简单的 Prolog 程序,用于展示我目前在使用真实代码时遇到的问题。

我正在尝试在 Prolog 中编写一个 Brainf*ck 解释器,但它没有返回正确的Output

我在跑步bf("+.", Output)

预期收益 -Output = [1]

实际回报 - Output = []

Output当它返回iterateProg(Prog,Output)in时失去它的价值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).
4

1 回答 1

1

你的谓词bf2(Prog, Output)的含义是:这个程序Prog与这个输出相对应Output- 所以谓词Output中的以及应该包含完整的输出。bf2iterateProg

所以在checkInstruction谓词中,前 2 个参数应该包含完整程序和完整输出,后 2 个参数应该包含部分程序和相应的部分输出。

因此,您应该附加[1]with NewOutput,以生成谓词Output第二条规则的最终输出。checkInstruction您应该New...使用不同的名称重命名 - 因为它实际上是部分/“尾”程序和相应的输出。

append([1], NewOutput, Output)

注意顺序(我在评论中不准确)。[1]是当前指令的输出,它应该在中指令的输出之前ProgTail

顺便说一句,bf2谓词是不必要的——因为它iterateProg用完全相同的参数调用谓词。

另一件事iterateProg([],_)应该是iterateProg([],[])因为一个空程序应该对应于空输出。(反之亦然,所以!如果你已经了解了,你不应该在这里删减)。

于 2012-12-02T15:26:00.947 回答