2014-03-01 53 views
0

給出以下代碼片段,其中x是一個數字。如何導出循環不變式?

{ y >= 0 } 
z = 0 
n = y 
while (n > 0) begin 
z = z + x 
n = n – 1 
end 

它計算什麼?證明它,展示如何導出循環不變式。

我該怎麼做?

+0

我想它計算一個數字的總和,像factoriel但總和不是?對於循環不變的部分,我不知道 – user2977595

回答

0

對於給定XY它計算X * Y

在開始時,Z的值爲零,而N = Y(循環的變量將在我們的循環中倒計時)。

該循環執行Y次,並在每次執行時,累積XZ

最後,當N達到0時,循環將終止,那麼Z的值應爲X * Y

+0

謝謝,但你知道如何通過派生循環不變的方式來顯示它嗎? – user2977595

2

這個例子被稱爲最正確的程序,因爲它在每個軟件驗證過程中都被證明。下面是該方案與不變量上的每一步上市:

{ y >= 0 } z = 0 // invariant: z = 0 n = y // invariant: n = y and z = 0 while (n > 0) begin // loop invariant: y * x - n * x = z z = z + x n = n – 1 end // Final invariant: n = 0 and y * x = z

my paper page 118提供了這個例子所有的理論細節。