時々減少しないwhileループのループバリアント?


7

私が持っているテストの練習問題に取り組んでおり、ループバリアントのすべての例は、ループの反復ごとに減少しました。これについては、a <bの場合、値は同じままです。私の試みはまた、時々aがbより大きくなり、その逆になるため、負の可能性があるループバリアントを取得しました。この質問のループバリアントを見つけて証明するためのアドバイスはありますか?

def mystery(a,b):
# Precondition: a >= 0 and b >= 0
while a >= 0 and b >= 0:
    if a < b:
        a, b = b, a
    else:
        a = a - 1
return a

編集:この質問に興味がある人にとって、私の最善の解決策は次のとおりです。

f1=a+2b+1

1
非常に素晴らしい!あなたはそれを答えにすべきだと思います(あるいは答えさえも)。
— アントントルノフ2015年

回答:


7

これは練習問題なので、今のところヒントです。順序の辞書式の組み合わせを検討してください。

さらに詳しく:プログラム状態から2つのマップとがあり、順序付けられたドメインと ます。との辞書式の組み合わせは、またはいずれかである場合にによって与えられる上のの順序。また、十分な基盤があります。f1:S→D1f2:S→D2S(D1,≤1)(D2,≤2)≤1≤2≤D1×D2(x1,y1)≤(x2,y2)x1≤1x2x1=x2,y1≤2y2

したがって、がf1,f2

  • f1は決して増加せず、
  • が減少しないときはいつでも、は減少し、f1f2

次に、マップは、終了を証明するバリアントです。(f1,f2):S→D1×D2


ヒントをありがとう!辞書式の組み合わせはまだ行っていません。これから調べます。それがどのようにして減少するのかを説明していただけますか?
— Andrew Raleigh

@AndrewRaleigh私はいくつかの詳細を追加しました
— クラウス

それは多くの理にかなっています、そのように考えたことはありません。この場合、およびますか?それは時々同じままですが、講義のスライドはそれが許可されているかどうかについて何も述べていませんが。
f1=a
f2=b−a
— Andrew Raleigh

1
の問題は、増加する可能性があることです(が交換された場合)。この場合は同じままで、他の式では減少する式(が減少する場合)を見つけてみてください。f1=aa,ba
— Klaus Draeger、2015年

1

これは、1つのマッピングのみを含むアプローチです 単純なケース分析では、ループを進むにつれて常に減少することが示されます。

f=(a+1)⋅(b+1)+(b−a)
f
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.