gpt4 book ai didi

mercury - Mercury 是否支持代数谓词?

转载 作者:行者123 更新时间:2023-12-01 03:17:39 25 4
gpt4 key购买 nike

我对 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...")
).

最佳答案

刚刚发现可以进入different clauses for different modes .这不是一个代数求解器(无论如何我都不会想到),但提供了我正在寻找的精确组织结构:

:- pred diffThirtyFour(float, float).
:- mode diffThirtyFour(in, out) is det.
:- mode diffThirtyFour(out, in) is det.
:- pragma promise_pure(diffThirtyFour/2).

diffThirtyFour(A::out,B::in) :- A = B - 34.0.
diffThirtyFour(A::in, B::out) :- B = A + 34.0.

如链接中所述, promise_pure pragma 是必需的,因为此功能可用于破坏语义一致性。使用 promise_equivalent_clauses 也足够了。 pragma,它 promise 没有纯度的逻辑一致性。仍然可以用 impure 声明语义不一致的子句。 pred 声明中的关键字。

有趣的是,标准中的加减法 int模块是可逆的,但在 float 中不可逆模块。可能是因为浮点运算中可能出现的错误而做出的选择......

关于mercury - Mercury 是否支持代数谓词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47880106/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com