Prolog 您如何从逻辑上阐述操作系统死锁的问题?

Prolog 您如何从逻辑上阐述操作系统死锁的问题?,prolog,deadlock,Prolog,Deadlock,Prolog中的编程任务是编写一个程序,该程序接收进程、资源等的输入,并打印出安全的执行顺序,如果没有安全的执行顺序,则返回false 我对Prolog非常陌生,我只是无法让自己按照它要求我思考的方式思考(也就是说,以逻辑的方式表述问题,让编译器知道如何进行操作),我只能按部就班地思考。你会如何用谓词之类的逻辑来表述这样一个问题 示例输入如下:进程列表、资源对列表和该资源的可用实例数以及分配的事实(x,y),其中x是进程,y是分配给x的资源列表,最后是请求的(x,y)这样x是一个进程,y是x请求

Prolog中的编程任务是编写一个程序,该程序接收进程、资源等的输入,并打印出安全的执行顺序,如果没有安全的执行顺序,则返回false

我对Prolog非常陌生,我只是无法让自己按照它要求我思考的方式思考(也就是说,以逻辑的方式表述问题,让编译器知道如何进行操作),我只能按部就班地思考。你会如何用谓词之类的逻辑来表述这样一个问题

示例输入如下:进程列表、资源对列表和该资源的可用实例数以及分配的事实
(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
  • 等等
应用转换可能会使您生成一种状态,从中不可能有任何进展,但也不是“最终状态”。你被卡住了。在这种情况下,转储一些最新的转换,移回以前的状态,然后尝试其他转换

通过这一点,您可以在状态空间中获得一个状态树,同时探索达到某个最终状态(或单个最终状态,取决于问题)的不同可能性

我们需要的是:

  • 状态描述
  • 一组允许的状态转换(有时称为“运算符”)
  • 决定我们是否在一个状态中被阻止的标准
  • 决定我们是否已找到最终状态的标准
  • 也许是决定下一步尝试哪个州的启发式方法。如果状态空间足够小,我们可以盲目地尝试一切,否则类似的东西可能会有用
  • 探索算法本身。从初始状态开始,它应用操作符,生成新的状态,如果被阻止则返回,如果达到最终状态则终止
状态描述 状态(在任何时间t)由以下相关信息描述:

  • 许多过程
  • 许多资源,有几个是同类的
  • 关于哪些进程分配了哪些资源的信息
  • 关于哪些进程请求了哪些资源的信息
与信息学中的任何其他内容一样,我们需要用于上述内容的数据结构

Prolog中的默认数据结构是术语,即符号树。非常有用的列表只是特定树的另一种表示形式。我们必须创建一个表示,这样它才能与人对话,并且仍然可以通过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\u deadlock(StateIn)
。它必须测试任何死锁条件下的状态描述(实际上执行自己的小搜索)

决定我们是否已找到最终状态的标准 这是不明确的。这个问题的最终状态是什么

在任何情况下,如果
StateIn
确实是最终状态,则必须有一个
check\u final(StateIn)
谓词返回
true

请注意,最终性标准也可能是关于从开始状态到当前状态的整个路径。在这种情况下:
检查路径([StartState,NextState,…,CurrentState])

探索算法 这可能是一个相对的问题