我对 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
这可能是答案......它在编译时发出警告,说明分离永远没有任何解决方案。一个正确的警告,但可能是不必要的代码气味?这可以满足我的需要,但如果有更好的解决方案,请随时发布它们......
:- 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...")
).