特に (\=)/2 と (\==)/2 のいくつかの非宣言性に対する救済策として、dif/2 制約の周りには多くの誇大宣伝があります。この非宣言性はしばしば非単調性として特徴付けられ、非可換性の例が示されています。
しかし、dif/2 を含むテスト ケースが交換可能かどうかをテストする手段は何でしょうか。これが私がやりたいことのメタ説明です:
可換性テストを行い、両方のバリアントが同じ結果になることを調べたいと思います。
?- A, B. -- versus -- ?- B, A.
したがって、通常、(==)/2 組み込み述語を使用して、可換性をチェックすることになる場合は、単調性をチェックできます。この述語は、インスタンス化された変数に続くためです。
しかし、制約を生成するケースをテストしている場合、call_with_residue/2 では十分ではなく、制約の等価性も必要です。次の例に示すように、これは難しい場合があります。
Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 7.3.23)
Copyright (c) 1990-2015 University of Amsterdam, VU Amsterdam
?- dif(f(X,X),f(a(U,g(T)),a(g(Z),U))), X=a(g(Z),U).
X = a(g(Z), U),
dif(f(a(g(Z), U), U, Z, U, T), f(a(U, g(T)), g(Z), T, g(Z), Z)).
?- X=a(g(Z),U), dif(f(X,X),f(a(U,g(T)),a(g(Z),U))).
X = a(g(Z), U),
dif(f(U, T), f(g(Z), Z)).
続行する方法はありますか?
免責事項、それは罠です。
私は、良い述語と悪い述語を仕様に対して分離できる優れたテスト方法として交換性テストを推奨しません。通常、良い述語と悪い述語の両方が可換性に問題がない可能性があるためです。
dif/2 制約の等価性を調べる手段として可換性テストを使用しています。この等価性は、より伝統的なテスト ケースで検証ポイントとして使用できます。