4

これは、実際のコードで現在抱えている問題を示す簡単な Prolog プログラムです。

Prolog で Brainf*ck インタープリターを作成しようとしていますが、権利が返されません。Output

私は走っていますbf("+.", Output)

期待リターン -Output = [1]

実際の返品 - Output = [].

OutputiterateProg(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述語bf2とiniterateProgには完全な出力が含まれている必要があります。

したがって、checkInstruction述語では、最初の 2 つの引数には完全なプログラムと完全な出力が含まれている必要があり、最後の 2 つの引数には部分的なプログラムと対応する部分的な出力が含まれている必要があります。

したがって、述語の 2 番目のルールの最終出力を生成するには、 [1]withを追加する必要があります。実際には部分的/「テール」プログラムと対応する出力であるため、別の名前で名前を変更する必要があります。NewOutputOutputcheckInstructionNew...

append([1], NewOutput, Output)

順序に注意してください(コメントは不正確でした)。[1]は現在の命令の出力であり、 の命令の出力の前にある必要がありますProgTail

ちなみに、まったく同じ引数で述語をbf2呼び出すため、述語は不要です。iterateProg

もう1つのことは、空のプログラムは空の出力に対応するiterateProg([],_)必要があるためです。(逆は真ではないので、それについて学んだ場合は、ここにiterateProg([],[])カットを入れるべきではありません)。!

于 2012-12-02T15:26:00.947 に答える