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