我在OCaml中构建了两个包含相同变体类型的库.变体的细节并不太重要,除了它非常大,并且为它手动编写转换函数会很烦人.(它实际上是使用ocamlidl从C转换的bfd_architecture枚举).
我现在正在使用这两个库编写程序.特别是,我正在调用Af,它返回一个A.variant_type的值,我需要在调用Bg时使用该值,它将B.variant_type的值作为输入.
有没有办法告诉OCaml A.variant_type和B.variant_type实际上是同一类型,因此可以将值从一个转换为另一个?这些库是独立的,因此它们不应该相互引用.现在我正在使用Obj.magic进行转换,但这是一个黑客攻击.
如何模拟软切割 I* - > T; E在ISO Prolog中?我有副作用,所以我不能多次调用它.
除了最后一个要求,我认为以下定义有效:
if_(I, T, E) :-
not(not(I)) ->
call((I, T));
call((not(I), E)).
Run Code Online (Sandbox Code Playgroud)
(我实际上正在使用XSB prolog; XSB的解决方案对我也很有用.)
有没有办法告诉automake不要解释部分Makefile.am?
具体来说,我试图在Makefile.am中编码Makefile条件.正如其他人注意到的那样,这不起作用,因为automake解释了endif结构.
有没有办法逃脱或引用Makefile.am文件中的字符串,以便automake逐字复制到目标Makefile?具体来说,我不希望它在以下内容中解释endif:
ifeq "$(SOMEVAR)" ""
SOMEVAR="default_value"
endif
Run Code Online (Sandbox Code Playgroud) 我正在使用 Prolog 在我的一个项目中编码一些相当复杂的规则。有很多递归,包括相互递归。部分规则如下所示:
pred1(X) :- ...
pred1(X) :- someguard(X), pred2(X).
pred2(X) :- ...
pred2(X) :- othercondition(X), pred1(X).
Run Code Online (Sandbox Code Playgroud)
pred1和之间有一个相当明显的无限循环pred2。不幸的是,这些谓词之间的交互非常复杂且难以隔离。我能够通过传递已传递给 的对象列表来消除此实例中的无限循环pred1,但这非常笨拙!事实上,它在很大程度上违背了在这个应用程序中使用 Prolog 的目的。
如何让 Prolog 避免无限循环?例如,如果在证明过程中pred1(foo)尝试将证明pred1(foo)作为子目标,则失败并回溯。
是否可以使用元解释器来做到这一点?