Prolog中的编程任务是编写一个程序,该程序接受进程,资源等的输入,并打印出安全的执行顺序,或者如果没有安全的执行顺序,则简单地返回false。
我对序言很陌生,我只是无法让自己以要求我思考的方式思考(也就是说,以逻辑方式提出问题,让编译器找出如何进行操作),我被困在程序上的思考。您如何用谓词和诸如此类的逻辑来表达这样一个问题?
样本输入如下:进程列表,资源对列表以及该资源和事实的可用实例数allocated(x,y)
,其中x是进程,y是分配给x和x的资源列表。最后requested(x,y)
,使得x是一个进程,y是x请求的资源列表。
对于我的一生,除了C ++,我什么都想不到。我太困了。我什至不需要代码,只需要清楚。
编辑:这是示例输入。我真的只需要看我需要做什么。我完全一无所知。
进程([p1,p2,p3,p4,p5])。
available_resources([[r1,2],[r2,2],[r3,2],[r4,1],[r5,2]]。
已分配(p1,[r1,r2])。
已分配(p2,[r1,r3])。
已分配(p3,[r2])。
已分配(p4,[r3])。
已分配(p5,[r4])。
requested(p5,[r5])。
您要做的是应用"state search"方法。
通过这种方式,当您探索不同的可能性以达到最终状态之一(或单个最终状态,具体取决于问题)时,您会在状态空间中得到一棵状态树。
我们需要的是:
Prolog中的默认数据结构是
term,它是符号树。极其有用的列表只是特定树的另一种表示形式。必须具有一种表示形式,以便它可以与人类对话,并且仍然可以通过Prolog代码轻松地进行操作。那么像这样的术语呢:
[process(p1),owns(r1),owns(r1),owns(r2),wants(r3)]
这表示以下事实:进程p1
拥有两个资源r1
和一个资源r2
,并且接下来要r3
。
然后,完整状态是一个列表列表,用于指定有关每个进程的信息,例如:
[[process(p1),owns(r1),owns(r1),owns(r2),wants(r3)],
[process(p2),owns(r3),wants(r1)],
[process(p3),owns(r3)]]
操作员说明Prolog不允许“可变状态”,因此运算符是从一种状态到另一种状态的转换,而不是修补状态以表示其他状态。
状态未就地修改的事实当然非常重要,因为我们(可能)希望保留已访问的状态,以便在被阻止的情况下能够“追溯”到较早的状态。] >
我想可以使用以下运算符:
在状态StateIn
中,进程P
请求它需要但无法获得的资源R
。
request(StateIn, StateOut, P, R) :- .... code that builds StateOut from StateIn
在状态StateIn
中,进程P
获得空闲的资源R
。
obtain(StateIn, StateOut, P, R) :- .... code that builds StateOut from StateIn
在状态StateIn
中,进程P
释放拥有的资源R
。
free(StateIn, StateOut, P, R) :- .... code that builds StateOut from StateIn
编写该代码,使得如果StateIn
为
[[process(p1),owns(r1),owns(r1),owns(r2),wants(r3)], [process(p2),owns(r3),wants(r1)], [process(p3),owns(r3)]]
然后free(StateIn, StateOut, p1, r2)
将构造一个StateOut
[[process(p1),owns(r1),owns(r1),wants(r3)], [process(p2),owns(r3),wants(r1)], [process(p3),owns(r3)]]
这将成为搜索循环中的新当前状态。等]决定我们是否处于当前状态的标准
通常被“阻止”表示没有运算符适用于该状态,因为对于所有运算符而言,没有有效的先决条件成立。
在这种情况下,标准似乎是“国家暗示僵局”。
因此需要写谓词check_deadlock(StateIn)
。它必须测试状态描述中是否有任何死锁情况(实际上是进行自己的少量搜索)。
决定我们是否找到最终状态的标准
无论如何,如果check_final(StateIn)
确实是最终状态,则必须有true
谓词返回StateIn
。
check_path([StartState,NextState,...,CurrentState])
。探索算法
在Prolog中,这可能相对较短,如果您不使用特定的启发式方法并使情况保持原始,则可以免费进行深度优先搜索和回溯。