Prolog - 没有返回所需的变量

时间:2012-12-02 14:16:13

标签: prolog return-value

我意识到我的第一个问题太长了,没有人会理解它。

以下是link这个缩小的简单问题,可以在较短的程序中显示我的问题。

[强化问题链接] Prolog - Not returning desired value

=============================================== ===================================

我正在尝试在Prolog中编写一个Brainf * ck解释器。

函数bf将需要3个字符串。只有代码的相关部分如下:

%Prog - string of BF program
%Input- string of inputs for the BF program
%Output - what the BF program will output

bf(Prog, Input,Output):- run(Prog, Input, Output).

run(Prog, Input, Output) :-
    create_mem(Mem),
    iterateBF(Prog,[],Mem,0, Input, Output).

%start by creating the memory space
create_mem(Memory) :-
    var(Memory), %check if it is uninstantiated variable
    create_mem(Memory,10000).

create_mem([],0) :- !.
create_mem([0|Tail],Size) :-
    NewSize is Size - 1,
    create_mem(Tail,NewSize).

%get memory value at ptr location
get_mem([Value|_],Value,0). %base case
get_mem([_|Tail],Value,Ptr) :-
  Ptr > 0,
    NewPtr is Ptr - 1,
    get_mem(Tail,Value,NewPtr).

%for adding a value to memory space
%need to mod with 256 due to the it being 8 bits to get the actual value.

increase_mem([Value|MemTail],[NewValue|MemTail],0) :-
    NewValue is (Value + 1) mod 256.
increase_mem([Head|Tail],[Head|NewTail],Ind) :-
    Ind > 0,
    NewInd is Ind - 1,
    increase_mem(Tail,NewTail,NewInd).

%iterateBF(Prog,[],Mem,0, Input, []).
%when reach the end of the the

iterateBF([],_,_,_,_,[]) :- !.
iterateBF([],_,_,_,_,_) :-!.
iterateBF(Instruction,Inst_Iterated,Mem,Ptr,Input,Output) :-

   checkInstruction(Instruction,Inst_Iterated,Mem,Ptr,Input,Output,
      NewInstruction,NewInst_Iterated,NewMem,NewPtr,NewInput,NewOutput),
    iterateBF(NewInstruction,NewInst_Iterated,NewMem,NewPtr,NewInput,NewOutput).


checkInstruction([Plus|ProgTail],Inst_Iterated,Mem,Ptr,Input,Output,ProgTail,Inst_Iterated,NewMem,Ptr,Input,Output) :-
        char_code('+',Plus),
        increase_mem(Mem,NewMem,Ptr), !.

%get the memory value at ptr
%Put into Output
checkInstruction([Period|ProgTail],Inst_Iterated,Mem,Ptr,Input,Output,ProgTail,Inst_Iterated,Mem,Ptr,Input,NewOutput) :-
    char_code('.',Period),
    NewOutput = [Output|Value],
    get_mem(Mem,Value,Ptr),!.

以上代码将编译并仅适用于:

bf("+.","",Out).

SWI-Prolog将返回true,而我希望它返回Out的值。

在SWI中跟踪它,只要它返回到iterateBF(Prog,[],Mem,0, Input, Output)中的run来电,Output就会失去之前的值。

您只需要注意以下功能:

  1. 运行
  2. iterateBF
  3. checkInstructions
  4. 其余的只是为了汇编。

1 个答案:

答案 0 :(得分:1)

你的checkInstruction([Plus|ProgTail],Inst_Iterated,Mem,Ptr,Input,Output,ProgTail,Inst_Iterated,NewMem,Ptr,Input,Output)太复杂了。

确实你的问题是Output未正确绑定。但是,不是“平庸”的修正,而是一般的改进:

尝试评论您的代码,您希望它会做什么,并在完成后,尽可能简化