这个TLA +规范是否正确?

时间:2013-12-18 17:49:07

标签: formal-methods tla+

到目前为止,我已经为我的项目做了一些代码,但不知道它的真或假。你们能看到我的代码吗?首先,我应该发布更好理解的要求。

在计算机科学中,互斥是指确保同时没有两个进程或线程在其关键部分中的要求。关键部分是指进程访问共享资源(如共享内存)的时间段。 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)。使用互斥可以避免此问题,以确保不会同时更新列表的同一部分。

enter image description here

这是我的代码:

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 

1 个答案:

答案 0 :(得分:2)

首先,你想要建模什么?似乎你唯一感兴趣的是作为一个定理证明是类型不变量。我原以为你想要证明一些关于互斥的事情,而不仅仅是P1P2的可能价值。例如,您是否要证明P1P2从未同时锁定?

MutualExclusion == ~(P1 = Locked /\ P2 = Locked)
THEOREM MutualExclusionTheorem == Spec => []MutualExclusion

另外,我不会将TypeInvariant放在Init的定义中。您的Init应包含变量P1P2的起始值。那你有一个定理,

THEOREM InitTypeInvariant == Init => TypeInvariant

并证明它。该定理将用于定理Spec的证明。