sha*_*gus 6 prolog successor-arithmetics clpfd
我在教程中遇到了逻辑数字的这种自然数字评估,这给我带来了一些麻烦:
natural_number(0).
natural_number(s(N)) :- natural_number(N).
Run Code Online (Sandbox Code Playgroud)
该规则大致说:如果N
是0
很自然的,如果不是我们尝试发送的内容s/1
回递归的规则,直到内容0
,那么它是一个自然数如果不是那么它不是.
所以我测试了上面的逻辑实现,想到自己,如果我想代表s(0)
as 1
和s(s(0))
as 2
,那么这是有效的,但我希望能够转换s(0)
为1
.
我想到了基本规则:
sToInt(0,0). %sToInt(X,Y) Where X=s(N) and Y=integer of X
Run Code Online (Sandbox Code Playgroud)
所以这是我的问题:如何将s(0)转换为1并将s(s(0))转换为2?
已经回答了
编辑:我在实现中修改了基本规则,我接受的答案指向了我:
decode(0,0). %was orignally decode(z,0).
decode(s(N),D):- decode(N,E), D is E +1.
encode(0,0). %was orignally encode(0,z).
encode(D,s(N)):- D > 0, E is D-1, encode(E,N).
Run Code Online (Sandbox Code Playgroud)
所以我现在可以像我想的那样使用它,谢谢大家!
这是使用library(clpfd)
SWI,YAP或SICStus "双向"工作的另一种解决方案
:- use_module(library(clpfd)).
natsx_int(0, 0).
natsx_int(s(N), I1) :-
I1 #> 0,
I2 #= I1 - 1,
natsx_int(N, I2).
Run Code Online (Sandbox Code Playgroud)
元谓词 与Prolog lambdanest_right/4
结合使用
没有问题!
:- use_module(library(lambda)).
:- use_module(library(clpfd)).
:- meta_predicate nest_right(2,?,?,?).
nest_right(P_2,N,X0,X) :-
zcompare(Op,N,0),
ord_nest_right_(Op,P_2,N,X0,X).
:- meta_predicate ord_nest_right_(?,2,?,?,?).
ord_nest_right_(=,_,_,X,X).
ord_nest_right_(>,P_2,N,X0,X2) :-
N0 #= N-1,
call(P_2,X1,X2),
nest_right(P_2,N0,X0,X1).
Run Code Online (Sandbox Code Playgroud)
示例查询:
?- nest_right(\X^s(X)^true,3,0,N).
N = s(s(s(0))). % succeeds deterministically
?- nest_right(\X^s(X)^true,N,0,s(s(0))).
N = 2 ; % succeeds, but leaves behind choicepoint
false. % terminates universally
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2153 次 |
最近记录: |