Prolog - 没有返回所需的值

时间:2012-12-02 14:58:48

标签: prolog return-value

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

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

我正在运行bf("+.", Output)

预期回报 - Output = [1]

实际回报 - Output = []

OutputiterateProg(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).

1 个答案:

答案 0 :(得分:1)

您的谓词bf2(Prog, Output)具有以下含义:此计划Prog与此输出Output对应 - 因此Output谓词中的bf2以及iterateProg应包含完整输出。

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

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

append([1], NewOutput, Output)

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

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

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