Prolog 序言:麦卡锡91

Prolog 序言:麦卡锡91,prolog,Prolog,我正在学习递归,遇到了 我已经能够在几种语言(C++、Java、Python、Scheme等)中找到它的示例。不过,我正试图找出它是如何用Prolog编写的 我在网上找不到任何例子,也不知道如何自己写(用Prolog)。有人可以发布它的代码示例,或者在网上告诉我正确的源代码吗?非常感谢你的帮助 m91(N, M) :- ( N > 100 -> M is N - 10 ; Np11 is N + 11, m91(Np11

我正在学习递归,遇到了

我已经能够在几种语言(C++、Java、Python、Scheme等)中找到它的示例。不过,我正试图找出它是如何用Prolog编写的

我在网上找不到任何例子,也不知道如何自己写(用Prolog)。有人可以发布它的代码示例,或者在网上告诉我正确的源代码吗?非常感谢你的帮助

m91(N, M) :-
    ( N > 100 ->
        M is N - 10
    ;
        Np11 is N + 11,
        m91(Np11, M1),
        m91(M1, M)
    ).
它实际上不是一个函数,而是一个谓词。结果在第二个参数中为“returned”:

?- m91(99, M).
M = 91.

?- m91(87, M).
M = 91.

?- m91(187, M).
M = 177.
一些Prolog实现允许使用这样的谓词作为算术函数。使用:

它实际上不是一个函数,而是一个谓词。结果在第二个参数中为“returned”:

?- m91(99, M).
M = 91.

?- m91(87, M).
M = 91.

?- m91(187, M).
M = 177.
一些Prolog实现允许使用这样的谓词作为算术函数。使用:


这里是SWI Prolog中的一个测试,使用(我在上面留下了non-lifted子句,以便于理解)

这是纯序言中的翻译(当然,在重命名变量后,与Sergey one相同)


这里是SWI Prolog中的一个测试,使用(我在上面留下了non-lifted子句,以便于理解)

这是纯序言中的翻译(当然,在重命名变量后,与Sergey one相同)


这里有几个值得注意的方面。毕竟,这个函数的初衷是在形式验证的上下文中考虑它。

只要你用
(is)/2
对这个函数进行编码,你就会得到与其他语言基本相同的结果——这是一个需要推理的函数。您需要从
(is)/2的模式算法切换到
库(clpfd)
提供的(基本)代数,以便将Prolog直接转换为关于关系的推理:

:- use_module(library(clpfd)).

m(N0,N):-
   N0#>100,
   N #= N0-10.
m(N0,N):-
   N0#=<100,
   N1 #=N0+11,
   m(N1,N2),
   m(N2,N).
或者,更具体地说,我们可能会问这个“函数”何时不等于91:

?- N#\=91, m(N0,N).
N in 92..sup,
N+10#=N0,
N0 in 102..sup ; LOOPS
第一个答案告诉我们,对于102..sup
中的值
N0,结果不会是91。然后,系统试图找到下一个答案,但需要太多的时间(也就是说,对于我们这些有限的生命来说,时间太多了)

理想情况下,我们应该实现
m/2
,如下所示:

m2(N0,N) :-
   N0#>100,
   N #= N0-10.
m2(N0,N):-
   N0#=<100,
   N #= 91.

所以我们在这里用有限的方法描述了无穷多个解

这里有几个值得注意的方面。毕竟,这个函数的初衷是在形式验证的上下文中考虑它。

只要你用
(is)/2
对这个函数进行编码,你就会得到与其他语言基本相同的结果——这是一个需要推理的函数。您需要从
(is)/2的模式算法切换到
库(clpfd)
提供的(基本)代数,以便将Prolog直接转换为关于关系的推理:

:- use_module(library(clpfd)).

m(N0,N):-
   N0#>100,
   N #= N0-10.
m(N0,N):-
   N0#=<100,
   N1 #=N0+11,
   m(N1,N2),
   m(N2,N).
或者,更具体地说,我们可能会问这个“函数”何时不等于91:

?- N#\=91, m(N0,N).
N in 92..sup,
N+10#=N0,
N0 in 102..sup ; LOOPS
第一个答案告诉我们,对于102..sup
中的值
N0,结果不会是91。然后,系统试图找到下一个答案,但需要太多的时间(也就是说,对于我们这些有限的生命来说,时间太多了)

理想情况下,我们应该实现
m/2
,如下所示:

m2(N0,N) :-
   N0#>100,
   N #= N0-10.
m2(N0,N):-
   N0#=<100,
   N #= 91.

所以我们在这里用有限的方法描述了无穷多个解

谢谢分享,我很感激。谢谢分享,我很感激。
?- m2(N0,N).
N0 in 101..sup,
N+10#=N0,
N in 91..sup ;
N = 91,
N0 in inf..100.