私はMercuryとロジックプログラミングには一般的に新しいです。これにより代数述語はMercuryでサポートされていますか?
:- pred diffThirtyFour(float, float).
:- mode diffThirtyFour(in, out) is det.
diffThirtyFour(A,B) :-
(B = A + 34.0).
、Aは地面でなければならない、とBは自由である:私は
を例述語を取る...ドキュメントやサンプルでは、このような数値例を発見していません。 Aを自由にし、Bを磨く(例えば、mode diffThirtyFour(out,in) is det.
を追加する)場合はどうでしょうか?この種の代数はコンパイル時に実行できますか?
更新...私は簡単に別の述語を定義することができますが、それは非常に論理的なようではありませんので
、作品のこの種のようなもの:の
:- pred diffThirtyFour(float, float).
:- mode diffThirtyFour(in, out) is semidet.
:- mode diffThirtyFour(out, in) is semidet.
diffThirtyFour(A,B) :-
(B = A + 34.0, A = B - 34.0).
少し警戒semidet
、および第2目標の冗長性。これを行う唯一の方法ですか?
アップデート2
これが答えかもしれません...それは論理和が任意のソリューションを持つことがない程度コンパイル時に警告を発行します。正しい警告ですが、おそらく不必要なコードの臭いですか?これは私が必要なものを行いますが、より良い解決策がそこに存在する場合、それらを掲示すること自由に感じ...
:- pred diffThirtyFour(float, float).
:- mode diffThirtyFour(in, out) is det.
:- mode diffThirtyFour(out, in) is det.
diffThirtyFour(A,B) :-
(A = B - 34.0,
B = A + 34.0
;
error("The impossible happened...")
).