我一直试图理解如何从回溯的Prolog谓词中产生一系列值.内置谓词between/3
将在回溯时一次生成一个范围内的所有整数,因此编写它的示例可以帮助我完成任务.
我在现有的Prolog系统中寻找了一个实现,但between/3
GNU Prolog 的实现是一个C函数,其技巧是调用另一个C函数"Pl_Create_Choice_Point",它允许它在回溯时产生额外的值.
标准Prolog谓词的时间复杂度是否有上限保证?
例如:在任何符合标准的Prolog系统中,是否确定sort(+List, ?SortedList)
在O(nlog(n))时间(n是长度List
)中运行?
我知道这一点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) 这个问题
我有一个与逻辑纯度有关的问题.
这个节目是纯粹的吗?
when(ground(X), X > 2).
Run Code Online (Sandbox Code Playgroud)
关于上下文的一些[ir]相关细节
我正在尝试编写具有良好终止属性的纯谓词.例如,我想编写一个list_length/2
描述列表与其长度之间关系的谓词.我想实现与内置谓词相同的终止行为length/2
.
我的问题试图找出以下谓词是否纯粹:
list_length([], 0).
list_length([_|Tail], N):-
when(ground(N), (N > 0, N1 is N - 1)),
when(ground(N1), N is N1 + 1),
list_length(Tail, N1).
Run Code Online (Sandbox Code Playgroud)
我可以用clpfd实现我的目标......
:- use_module(library(clpfd)).
:- set_prolog_flag(clpfd_monotonic, true).
list_length([], 0).
list_length([_|Tail], N):-
?(N) #> 0,
?(N1) #= ?(N) - 1,
list_length(Tail, N1).
Run Code Online (Sandbox Code Playgroud)
......或者我可以使用var/1
,nonvar/1
并且!/0
,后来是很难证明谓词是纯粹的.
list_length([],0).
list_length([_|Tail], N):-
nonvar(N), !,
N > 0,
N1 is N - 1,
list_length(Tail, …
Run Code Online (Sandbox Code Playgroud)