标签: mercury

除了Monads之外,还有哪些其他方式可以用纯函数语言处理?

所以我开始围绕Monads(在Haskell中使用).我很好奇IO或状态可以用纯函数语言处理的其他方式(理论上或现实中).例如,有一种名为"mercury"的逻辑语言使用"效果打字".在诸如haskell之类的程序中,效果打字工作会如何?其他系统如何运作?

haskell functional-programming mercury

45
推荐指数
4
解决办法
3014
查看次数

什么更有趣或更强大:咖喱,水星还是Lambda-Prolog?

我想问一下从头开始/逆向工程师实施什么样的正式系统会更有趣.

我查看了一些逻辑/声明性编程系统的现有和开源项目.我决定在空闲时间编写类似的内容,或者至少要了解实现的一般概念.

如果这些系统中的一些能够提供逻辑中现代学术研究的大部分表达能力和简洁性以及它与计算模型的关系,那将是很好的.

你建议至少在概念层面学习什么?例如,Lambda-Prolog很有意思,因为它允许更高阶的关系,但AFAIK基于直觉主义逻辑,因此缺乏排除中间原则; 这通常对我不利.

我也欢迎任何有关现代逻辑编程系统的建议,这些系统不太受欢迎,但更具表现力/强大功能.

logic prolog logic-programming mercury curry

19
推荐指数
2
解决办法
2997
查看次数

Rust的所有权语义如何与Clean和Mercury中的唯一性类型相关?

我注意到在Rust中移动应用于左值,并且静态强制执行不移动的对象.

这些语义如何与Clean和Mercury中的唯一性类型相关?它们是相同的概念吗?如果没有,它们有何不同?

mercury move-semantics rust clean-language

19
推荐指数
1
解决办法
767
查看次数

最有用和最具指导性的功能逻辑语言

我对Prolog的力量感到非常惊讶.花了一些时间来解决问题,但对我来说,它似乎是那里最酷的声明性语言.这就是为什么最近,在使用Scala进行了两年的函数式编程之后,我决定再次看一下逻辑编程,以"训练我的大脑"或更好地实际使用.

结合功能和逻辑编程似乎对我学习/巩固两种声明范式的概念很有吸引力.我发现强力型系统非常有用且引人入胜.

Scala真的与interop一起闪耀.我们不要重新发明轮子.它应该能够用另一种主要语言调用代码,并且最好也可以调用.但它不一定是Java.C或Haskell也可以.

那么,今天最有用和最具启发性的FLP语言,您对它们的看法和建议是什么?

这是我到目前为止发现的:

  1. 水星:声称是快速,强类型的Prolog.纯粹的声明,但没有逻辑变量!没有约束编程?似乎是使用最广泛的FLP.互操作?

  2. 库里:看起来很有前途,也是最先进的,但现在文档上有点低."实验"是否意味着不成熟/不准备潜入?只是基于Haskell或实际上与Haskell的良好互操作?

  3. Ciao:似乎提供了我想要的许多功能,但Stack Overflow似乎根本不知道它,虽然它自1984年以来就存在了?它出什么问题了?互操作?

  4. drools(java library/DSL):声称它允许混合前向和后向链接.成熟.直接与Java/Scala互操作,但依赖于可变数据/命令式构造?它与功能JVM语言的集成程度如何?

  5. miniKanren:实现存在于多个平台上.如何互操作?高效?

  6. Lambda Prolog实现,例如:

    1. 卡利登:可能很好,但理论很重.有用?与Haskell有效互操作?文档?

    2. Teyjus.类似于卡利登.

良好但理论上的阅读并偏向于咖喱,而不是解决实际问题:

functional-programming logic-programming mercury curry

10
推荐指数
0
解决办法
953
查看次数

是否有任何版本的Prolog支持累加器的更高阶抽象?

我想知道一个Prolog可能包含这样的内置调用:

accum(generator, filter, accumulator)
Calculates all solutions to generator.
For each one, if filter can be proved, accumulator is proved.
Backtracks to find all solutions to filter and generator.
Accumulator may backtrack internally, but multiple proofs of accumulator are 
  conjoined, not backtracked.
Run Code Online (Sandbox Code Playgroud)

因此,例如,要在不使用递归的情况下对列表求和,您可以编写:

X is 0, accum(member(Val,List), True, X is X + Val).
Run Code Online (Sandbox Code Playgroud)

是否有任何Prolog与此结构或等效?请记住,我是Prolog的新手,可能会遗漏一些明显的东西.

prolog mercury

6
推荐指数
2
解决办法
324
查看次数

类型对Mercury等逻辑编程语言有什么好处?

我开始看Mercury语言,这看起来非常有趣.我是逻辑编程的新手,但在Scala和Haskell中使用函数式编程非常有经验.我一直在思考的一件事是,当你已经拥有至少与类型一样富有表现力的谓词时,为什么你需要逻辑编程中的类型.

例如,在以下代码段中使用类型有什么好处(取自Mercury教程):

:- type list(T) ---> [] ; [T | list(T)].

:- pred fib(int::in, int::out) is det.
fib(N, X) :-
  ( if N =< 2
  then X = 1
  else fib(N - 1, A), fib(N - 2, B), X = A + B
  ).
Run Code Online (Sandbox Code Playgroud)

与仅使用谓词编写它相比:

list(T, []).
list(T, [H | X]) :- T(H), list(T, X).

int(X) :- .... (builtin predicate)

fib(N, X) :-
  int(N),
  int(X),
  ( if N =< 2
  then X = 1
  else fib(N - 1, A), fib(N …
Run Code Online (Sandbox Code Playgroud)

logic types mercury first-order-logic

6
推荐指数
1
解决办法
952
查看次数

水星安装

我已经从http://www.mercury.csse.unimelb.edu.au/download/release.html下载Mercury 11.07.1

并在我的Windows 7 PC上安装了cygwin.但是我不知道如何安装汞.有没有人可以帮我安装指南?

mercury

5
推荐指数
1
解决办法
1332
查看次数

什么是“强模式”编程语言?

我正在浏览 Mercury 编程语言的关于页面时,发现其中有一段内容:

Mercury 是一种强模式化的语言

这是什么意思!?我在互联网上搜索了所有内容,都没有找到答案!

functional-programming mode mercury language-lawyer

5
推荐指数
1
解决办法
154
查看次数

如何像在 Prolog 中一样在 Mercury 中生成新变量列表?

在 SWI Prolog 中,list(Xs) :- length(Xs, _).是“纯”的,因为我可以向它传递一个具有任何类型实例化的变量,并且它将非确定性地将它与特定长度的所有最通用的统一词统一起来。

是否可以list/1在水星中写一个纯?该手册似乎暗示可以做到这一点,但我在实际实施时遇到了麻烦。

到目前为止我所拥有的是:

:- module mylist.

:- interface.

:- import_module list.

:- inst frees for list/1
    --->    []
    ;       [free | frees].
:- mode free_to_frees == free >> frees.

:- pred mylist(list(_)).
:- mode mylist(in) is det.
:- mode mylist(free_to_frees) is multi.

:- implementation.

:- pragma promise_pure(mylist/1).

mylist(_::in).

mylist([]::free_to_frees).
mylist([_|Xs]::free_to_frees) :- mylist(Xs).
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试这样做时:

:- module main.
:- interface.
:- implementation.
:- import_module list, mylist.

:- pred getlist(list(int)).
:- …
Run Code Online (Sandbox Code Playgroud)

prolog mercury

5
推荐指数
1
解决办法
87
查看次数

支持Mercury的IDE或编辑器

除了emacs之外,还有支持Mercury的IDE或编辑器吗?

ide editor mercury

4
推荐指数
2
解决办法
1368
查看次数

水星:决定论和模式匹配

我有一个半决定性的功能.当我重新编写它以使用模式匹配而不是if语句时,Mercury表示它变得不确定.我想明白为什么.

原始代码:

:- pred nth(list(T), int, T).
:- mode nth(in,      in,  out) is semidet.
nth([Hd | Tl], N, X) :- (if N = 0 then X = Hd else nth(Tl, N - 1, X)).
Run Code Online (Sandbox Code Playgroud)

修订后的代码:

:- pred nth(list(T), int, T).
:- mode nth(in,      in,  out) is nondet.
nth([Hd | _], 0, Hd).                             % Case A
nth([_ | Tl], N, X) :- N \= 0, nth(Tl, N - 1, X). % Case B
Run Code Online (Sandbox Code Playgroud)

我习惯于考虑SML中的模式匹配,其中案例A中的0将确保在B的情况下,N不是0. Mercury的工作方式不同吗?即使N为0,情况B也可以被调用吗?(我将N \= 0条款添加到案例B中,希望使谓词半自由,但这不起作用.)

有没有办法用模式匹配编写这个谓词,这也是半决定的?

pattern-matching mercury

4
推荐指数
1
解决办法
441
查看次数