可以在prolog中模拟一个简单的CPU吗?

时间:2012-11-24 00:18:29

标签: model prolog state-machine cpu-registers tree-search

我的理解是CPU的简单模型是状态机。

当我查看prolog时,它似乎是树搜索(或图搜索)组合,同时停止运行约束直到找到目标。

我被告知你可以在prolog中模拟一个简单的CPU。

是否有可能在prolog中表示像简单CPU这样的状态机模型?

2 个答案:

答案 0 :(得分:2)

Prolog是一种图灵完备语言,因此您可以在其中表达任意计算,包括CPU的模拟。您可以将单个指令的执行表达为CPU的两个状态之间的关系,一个在执行指令之前,一个在它之后(下一个要执行的指令也是状态的一部分,因为它是例如可用的)在其中一个CPU的寄存器中或通过其中一个寄存器):

cpustate0_cpustate(State0, State) :-
      ....

程序的完整执行可以声明性地描述为CPU的状态转换序列。在程序上,您将某个给定状态转换为某个已定义的最终状态,例如,直到某个寄存器包含或指向某个特定值:

cpu_before_after(State0, State) :-
    (    final_state(State0) -> State = State0
    ;    cpustate0_cpustate(State0, State1),
         cpu_before_after(State1, State)
    ).

编辑:例如,CPU的状态看起来像Prolog术语cpu(10, 20, 0) 这可能是一个特定的状态,其中第一个寄存器包含值10,第二个寄存器包含值20,第三个寄存器包含值0.让我们假设第三个寄存器是指令指针IP,并且CPU总是执行IP指向机器RAM的指令。所以我们还需要在状态表示中包含机器的RAM。让我们将机器的状态表示为一对RAM-CPU,RAM是机器RAM内容的合适表示,CPU是CPU寄存器的表示:

cpustate0_cpustate(State0, State) :-
     State0 = RAM0-cpu(_,_,IP0),   
     ram_at_value(RAM0, IP0, Instruction),
     instruction_state0_state(Instruction, State0, State).

假设现在有一条指令add,它会添加前两个寄存器的值并将结果存储在第一个寄存器中,而不会修改RAM:

instruction_state0_state(add, RAM-cpu(A0,B,IP), RAM-cpu(A1,B,IP)) :-
    A1 #= A0 + B.

您可以通过此谓词的其他子句描述其他可用指令的效果。

答案 1 :(得分:2)

正如席子所说,这完全有可能。

当然,这是一个非常重要的问题。

是的,你可以在prolog中拥有一个状态机 - 有几个问题关于在stackoverflow上创建一个。

我建议虽然CPU是有限状态机,但它可能很容易变大 - 常用的8051控制器有15个字节的寄存器。因为粗略估计假设任何人都可以假定任何值是合理的,

1? - X是2 ^(15 * 8) | 。 X = 1329227995784915872903807060280344576。

的状态。而且没有建模外部存储器。  您可能无法找到具有大量内存的计算机。

您可能会发现状态机的用途是解释个别说明。

所以,如果你是Prolog的新手,我会在尝试这个范围之前建议学习一点。我开始玩游戏来玩tic tac toe。这是关于正确的范围。