假设我在 Prolog 中有一个简单的程序,它正在搜索某个状态空间:
search(State, State) :-
is_solution(State).
search(State, Solution) :-
generate(State, NewState),
search(NewState, Solution).
我知道:
generate(State, NewState)
NewState
正在为任何给定的生产至少一个State
- 整个状态空间是有限的
我想修改search
谓词以确保它始终能够在有限时间内进行检查。所以我写了类似的东西:
search(State, Solution) :-
empty_memory(EmptyMem),
add(State, EmptyMem, Memory),
search(State, Memory, Solution).
search(State, _, State) :-
is_solution(State).
search(State, Memory, Solution) :-
generate(State, NewState),
\+ exist(NewState, Memory),
add(NewState, Memory, NewMemory),
search(NewState, NewMemory, Solution).
这是有效的,但它在回溯期间丢失了计算状态,所以现在我有一个空间大小最大高度的搜索树。
有没有办法在回溯期间传播状态而不会丢失任何计算信息?我想要一个带有 O(space_size) 节点的整个搜索树。可能吗?
编辑:
似乎我应该使用它assert/[1,2]
来动态创建将用作全局内存的新子句。