到目前为止,我已经为我的项目做了一些代码,但不知道它的真或假。你们能看到我的代码吗?首先,我应该发布更好理解的要求。
在计算机科学中,互斥是指确保同时没有两个进程或线程在其关键部分中的要求。关键部分是指进程访问共享资源(如共享内存)的时间段。 Edsger W. Dijkstra在1965年的题为“解决并发编程控制中的问题”的论文中首次发现并解决了互斥问题。
有关问题的直观描述,请参见图。在链表中,通过改变前一节点的“下一个”指针以指向后续节点来完成节点的移除(例如,如果节点i被移除则节点i-1的“下一个”指针将是改为指向节点i + 1)。在多个进程之间共享这种链表的执行中,两个进程可能同时尝试删除两个不同的节点,导致以下问题:让节点i和i + 1成为要删除的节点;而且,既不是头也不是尾巴;节点i-1的下一个指针将被改变为指向节点i + 1,并且节点i的下一个指针将被改变为指向节点i + 2。虽然两个删除操作都成功完成,但节点i + 1仍然在列表中,因为i-1指向i + 1跳过节点i(这是通过将其下一个指针设置为i来反映i + 1的删除的节点I + 2)。使用互斥可以避免此问题,以确保不会同时更新列表的同一部分。
这是我的代码:
EXTENDS Naturals
CONSTANT Unlocked, Locked
VARIABLE P1,P2
TypeInvariant == /\ P1 \in {Unlocked,Locked}
/\ P2 \in {Unlocked,Locked}
Init == /\ TypeInvariant
/\ P1 = Unlocked
Remove1 == P2' = Locked
Remove2 == P1' = Locked
Next == Remove1 \/ Remove2
Spec == Init /\ [][Next]_<<P1,P2>>
THEOREM Spec => []TypeInvariant
答案 0 :(得分:2)
首先,你想要建模什么?似乎你唯一感兴趣的是作为一个定理证明是类型不变量。我原以为你想要证明一些关于互斥的事情,而不仅仅是P1
和P2
的可能价值。例如,您是否要证明P1
和P2
从未同时锁定?
MutualExclusion == ~(P1 = Locked /\ P2 = Locked)
THEOREM MutualExclusionTheorem == Spec => []MutualExclusion
另外,我不会将TypeInvariant
放在Init
的定义中。您的Init
应包含变量P1
和P2
的起始值。那你有一个定理,
THEOREM InitTypeInvariant == Init => TypeInvariant
并证明它。该定理将用于定理Spec
的证明。