非常に詳細なDraft proposal for setup_call_cleanup/3があります。`setup_call_cleanup/3`は決定性を移植可能に検出しますか?
私は私の質問のための関連部分を引用してみましょう:
c)のクリーンアップハンドラが1回だけ呼び出されます。遅くともG.の障害発生時よりも以前の瞬間がありません:
Gはtrueまたはfalseの場合、Cは最後の解決策の後と
G.
の最後の観察可能な効果の後に実装依存の瞬間に呼ばれそして、この例:統一は backtrackable目標ですので、私の理解で
setup_call_cleanup(S=1,G=2,write(S+G)).
Succeeds, unifying S = 1, G = 2.
Either: outputs '1+2'
Or: outputs on backtracking '1+_' prior to failure.
Or (?): outputs on backtracking '1+2' prior to failure.
が、これは基本的にあります。それは単に再実行で失敗します。したがって、それは、(目標のこれ以上の観察可能な 効果があるでしょうので)ちょうど 拳の実行後にクリーンアップを呼び出す、または の二実行されるまで延期するかどうかを決定するために実装次第 です目標は今失敗する。
だから、これは確定性を検出するためには使用できません。 true
,fail
、!
などのような組み込みの構造体は、ほんの遡及できません。
目標を2回実行せずに確定性をチェックする方法はありますか? 私は現在SWI-prologのdeterministic/1
を使用していますが、確かに は移植性を高く評価しています。
したがって、決定論はどういう意味ですか?選択ポイントの存在 - それは明らかに**実装に依存します**!全く同じ実装で同じ結果に頼ることさえできません。 SWIは、JIT索引付けを時々実行する傾向がありますが、再現性の高い方法で実行するのは困難です。 – false
@false:私は論理的な意味を持っていましたが、トップレベルでは 'X = 2'が確定的であることを意味する限り、誰でもやります。 – mnish