相关疑难解决方法(0)

Prolog - 红色切割和绿色切割之间的差异

我开始学习prolog,并希望让整个切割更加清晰.我已经读到"绿色切割不会改变程序的声明性含义,而红切不会".但是,程序的意义并不是真正纯粹的声明(仅仅是因为prolog实际上是为所有选项回溯).

这是一个例子:

p(1).
p(2) :- !.
p(3).
Run Code Online (Sandbox Code Playgroud)

据说这是绿色切割.但如果我运行这个:

p(X), X =:= 3.
Run Code Online (Sandbox Code Playgroud)

我会在没有剪辑的情况下获得"真实",并且在剪切时获得"假".所以,我错过了什么?

提前致谢.

prolog prolog-cut

15
推荐指数
1
解决办法
7638
查看次数

Prolog中的"逻辑纯度"是什么意思?

什么是"逻辑纯度"(在Prolog编程的背景下)?该标记信息说,"使用程序只喇叭条款",但随后又怎么会谓词喜欢if_/3出线,使用因为它切为多,和各种元逻辑(什么是适当的术语?var/1和这样)谓词,即低级别的东西.

我明白它实现了一些"纯粹"的效果,但这究竟是什么意思呢?

有关更具体的说明,请解释如何if_/3符合逻辑纯度,在使用看到,例如在此答案中

logic prolog logical-purity

14
推荐指数
1
解决办法
685
查看次数

可逆的"二进制到数字"谓词

将二进制位(例如,可能是0/1的列表)以可逆方式转换为数字的最佳方法是什么.我在swi中编写了一个原生谓词,但有更好的解决方案吗?最好的祝福

prolog clpfd

9
推荐指数
2
解决办法
1672
查看次数

继承算术总和的最佳绿色削减是什么?

神交在序言绿色削减我试图将它们添加到继任算术总和的标准定义(见谓词plus什么是该查询的SLD树?).这个想法是通过消除所有无用的回溯(即,没有... ; false)尽可能"清理"输出,同时在参数实例化的所有可能组合下保持相同的行为 - 所有实例化,一个/两个/三个完全未实例化,以及所有变化包括部分实例化的args.

这是我在尝试尽可能接近这个理想时能够做到的事情(我承认错误的答案是如何插入绿色切割append/3作为来源):

natural_number(0).
natural_number(s(X)) :- natural_number(X).

plus(X, Y, X) :- (Y == 0 -> ! ; Y = 0), (X == 0 -> ! ; true), natural_number(X).
plus(X, s(Y), s(Z)) :- plus(X, Y, Z).
Run Code Online (Sandbox Code Playgroud)

在SWI下,这似乎适用于所有查询但有形状的查询?- plus(+X, -Y, +Z).,如SWI的谓词描述符号.例如,?- plus(s(s(0)), Y, s(s(s(0)))).收益率Y = s(0) ; false..我的问题是:

  • 我们如何证明上述削减是(或不是)绿色?
  • 我们能否做到比上述计划更好,并通过添加其他一些绿色削减消除最后的回溯?
  • 如果有,怎么样?

prolog swi-prolog successor-arithmetics prolog-cut

6
推荐指数
1
解决办法
370
查看次数

逻辑纯度为/ 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
查看次数