作为对这个问题的后续,我为基于Prolog的语言布氏对数实现了自己的标记谓词brachylog_equals/2,它不一定会终止,但适用于无限域:
brachylog_equals(Z,Z) :-
brachylog_equals_('init',10,Z).
brachylog_equals_(I,J,'integer':Z) :-
fd_inf(Z,'inf'),
fd_sup(Z,'sup')
-> (
(
I = 'init'
;
I \= 'init',
abs(Z) #>= I
),
abs(Z) #< J,
label([Z])
;
I2 is J,
J2 is J*10,
brachylog_equals_(I2,J2,'integer':Z)
)
;
fd_inf(Z,'inf')
-> (
(
I = 'init'
;
I \= 'init',
Z #=< -I
),
Z #> -J,
label([Z])
;
I2 is J,
J2 is J*10,
brachylog_equals_(I2,J2,'integer':Z)
)
;
fd_sup(Z,'sup')
-> (
(
I = 'init'
;
I \= 'init',
Z #>= I
),
Z #< J,
label([Z])
;
I2 is J,
J2 is J*10,
brachylog_equals_(I2,J2,'integer':Z)
)
;
label([Z]).有关此代码的几个注意事项:
'integer':Z而不是简单的Z只是为了遵守项目的其余部分(它用于检查其他谓词中的参数类型)以下是我的担忧:
当然,对代码样式(我知道它不尊重通常的惯例)或代码简化的评论也是欢迎的。
发布于 2016-06-02 10:37:19
在讨论正确性、效率和替代方法之前,我首先有三个较小的建议来稍微简化谓词:
I2似乎没有真正需要的地方,您总是可以简单地使用J。J2,我将坚持使用CLP(FD)约束,比如:J2 #= J*10。(\=)/2不同,我建议使用dif/2。这些更改使代码更易于阅读和更统一,并使我们能够更好地讨论其余的问题。
https://codereview.stackexchange.com/questions/129924
复制相似问题