Prolog 您如何从逻辑上阐述操作系统死锁的问题?
Prolog中的编程任务是编写一个程序,该程序接收进程、资源等的输入,并打印出安全的执行顺序,如果没有安全的执行顺序,则返回false 我对Prolog非常陌生,我只是无法让自己按照它要求我思考的方式思考(也就是说,以逻辑的方式表述问题,让编译器知道如何进行操作),我只能按部就班地思考。你会如何用谓词之类的逻辑来表述这样一个问题 示例输入如下:进程列表、资源对列表和该资源的可用实例数以及分配的事实Prolog 您如何从逻辑上阐述操作系统死锁的问题?,prolog,deadlock,Prolog,Deadlock,Prolog中的编程任务是编写一个程序,该程序接收进程、资源等的输入,并打印出安全的执行顺序,如果没有安全的执行顺序,则返回false 我对Prolog非常陌生,我只是无法让自己按照它要求我思考的方式思考(也就是说,以逻辑的方式表述问题,让编译器知道如何进行操作),我只能按部就班地思考。你会如何用谓词之类的逻辑来表述这样一个问题 示例输入如下:进程列表、资源对列表和该资源的可用实例数以及分配的事实(x,y),其中x是进程,y是分配给x的资源列表,最后是请求的(x,y)这样x是一个进程,y是x请求
(x,y)
,其中x是进程,y是分配给x的资源列表,最后是请求的(x,y)
这样x是一个进程,y是x请求的资源列表
对于我来说,我的生命是无法用C++来思考的。我太困了。我甚至不需要代码,只需要清晰
编辑:这里是一个示例输入。我真的需要看看我需要做什么。我完全不懂
processes([p1, p2, p3, p4, p5]).
available_resources([[r1, 2], [r2, 2], [r3, 2], [r4, 1], [r5, 2]]).
allocated(p1, [r1, r2]).
allocated(p2, [r1, r3]).
allocated(p3, [r2]).
allocated(p4, [r3]).
allocated(p5, [r4]).
requested(p5, [r5]).
您要做的是应用该方法
- 从初始状态S0开始
- 根据允许的规则对S0应用转换,给出S1。规则必须只允许创建一致的状态。例如,规则可能不允许在nihilo之外生成新资源
- 检查新状态S1是否满足允许您宣布胜利的“最终状态”或“解决方案状态”的条件
- 如果不是,则根据允许的规则对S1应用转换,得到S2
- 等等
- 状态描述李>
- 一组允许的状态转换(有时称为“运算符”)李>
- 决定我们是否在一个状态中被阻止的标准李>
- 决定我们是否已找到最终状态的标准李>
- 也许是决定下一步尝试哪个州的启发式方法。如果状态空间足够小,我们可以盲目地尝试一切,否则类似的东西可能会有用
- 探索算法本身。从初始状态开始,它应用操作符,生成新的状态,如果被阻止则返回,如果达到最终状态则终止
- 许多过程
- 许多资源,有几个是同类的
- 关于哪些进程分配了哪些资源的信息
- 关于哪些进程请求了哪些资源的信息
[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\u deadlock(StateIn)
。它必须测试任何死锁条件下的状态描述(实际上执行自己的小搜索)
决定我们是否已找到最终状态的标准
这是不明确的。这个问题的最终状态是什么
在任何情况下,如果StateIn
确实是最终状态,则必须有一个check\u final(StateIn)
谓词返回true
请注意,最终性标准也可能是关于从开始状态到当前状态的整个路径。在这种情况下:检查路径([StartState,NextState,…,CurrentState])
探索算法
这可能是一个相对的问题