我的理解是CPU的简单模型是状态机。
当我查看prolog时,它似乎是树搜索(或图搜索)组合,同时停止运行约束直到找到目标。
我被告知你可以在prolog中模拟一个简单的CPU。
是否有可能在prolog中表示像简单CPU这样的状态机模型?
答案 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。这是关于正确的范围。