2016-03-28 7 views
3

この質問は、Prologのカスタムラベリングに関するもう1つの質問に続きます。I posted earlier述語 `contracting/1`の復元で矛盾した値が削除されましたか?

contracting/1述部は、カスタムラベリング述部の変数に値を代入して使用すると、ドメインから「不整合」値を永久に削除しますか?または、バックトラッキング時にこれらの値が復元されますか?

+0

宣言するだけの観点から、一貫性のない値を復元する必要はありません。しかし、「contracting/1」は、ドメインの表現をあまりにも多く吹き飛ばして、使用することが不可能になる可能性があります。あるいは、ドメイン表現はその後、より高価な検索につながる。 – false

答えて

3

もちろん、これらの値はバックトラック時にに復元されたです。

は、それは彼らが述べるすべてが完全にバックトラックに取り消さであること、などCLP(FD)制約など純粋 Prologの述語の性質です。これがなければ、多くの重要な宣言的プロパティは保持されません。詳細については、を参照してください。

あなたは、これは、例えばサンプルセッションを使用して、clpfd:contracting/1のために保持していることを簡単に確認することができます

 
?- X in 0..5, X mod Y #= 2, Y in 0..2. 
X in 0..5, 
X mod Y#=2, 
Y in 1..2. 

?- X in 0..5, X mod Y #= 2, Y in 0..2, clpfd:contracting([X,Y]). 
false. 

?- X in 0..5, X mod Y #= 2, Y in 0..2, (clpfd:contracting([X,Y]) ; true). 
X in 0..5, 
X mod Y#=2, 
Y in 1..2. 
+1

ありがとう、私は論理純粋に見てみる:) – Manfred

関連する問題