将二进制位(例如,可能是0/1的列表)以可逆方式转换为数字的最佳方法是什么.我在swi中编写了一个原生谓词,但有更好的解决方案吗?最好的祝福
它们存在吗?他们是如何实施的?
所述coroutining SWI-Prolog的(的谓词freeze
,when
,dif
等)具有的功能警卫.它们如何适合首选的Prolog编程风格?
我是很新的逻辑编程(有序言和共)和事实,即它不是纯粹的声明,并要求即使在非常简单的情况下程序上的考虑有点困惑(见本关于使用问题\==
或dif
).我错过了重要的事吗?
我知道这一点var/1
,nonvar/1
并且!/0
是不纯的基元,但它们的使用是否会使每个使用它们的程序都不纯净?
我写了下面的谓词plus/3
,表现得好像是纯粹的,或者至少是我声称的那样.谓词是示范性的,不是为了提高效率.
% nat(X) is true if X is a natural number
nat(0).
nat(X):- nonvar(X), !, X > 0.
nat(X):- nat(X1), X is X1 + 1.
% plus(A, B, C) is true if A,B and C are natural numbers and A+B=C
plus(A, B, C):-
nat(A),
(nonvar(C), C < A, !, false ; true),
plus_(B, A, C).
plus_(A, B, C):-
nat(A),
(nonvar(C), C < A, !, false ; true),
C1 is …
Run Code Online (Sandbox Code Playgroud)