小编Tud*_*riu的帖子

你能在纯粹的prolog之间写/ 3吗?

我一直试图理解如何从回溯的Prolog谓词中产生一系列值.内置谓词between/3将在回溯时一次生成一个范围内的所有整数,因此编写它的示例可以帮助我完成任务.

我在现有的Prolog系统中寻找了一个实现,但between/3GNU Prolog 的实现是一个C函数,其技巧是调用另一个C函数"Pl_Create_Choice_Point",它允许它在回溯时产生额外的值.

prolog backtracking

14
推荐指数
2
解决办法
5619
查看次数

ISO Prolog谓词的复杂性

标准Prolog谓词的时间复杂度是否有上限保证?

例如:在任何符合标准的Prolog系统中,是否确定sort(+List, ?SortedList)在O(nlog(n))时间(n是长度List)中运行?

prolog time-complexity iso-prolog

8
推荐指数
1
解决办法
534
查看次数

Prolog的纯度谓词使用不纯的原语

我知道这一点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)

prolog logic-programming logical-purity

8
推荐指数
2
解决办法
337
查看次数

逻辑纯度为/ 2和地面/ 1

这个问题

我有一个与逻辑纯度有关的问题.

这个节目是纯粹的吗?

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)

我可以用实现我的目标......

:- 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)

prolog logical-purity

5
推荐指数
1
解决办法
241
查看次数