小编Pau*_*ura的帖子

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,从源头学习Prolog Now!.

在第5章中,我们来了解累加器.作为示例,给出了这两个代码片段. 查找列表的长度

没有累加器:

len([],0).
len([_|T],N) :- len(T,X), N is X+1.
Run Code Online (Sandbox Code Playgroud)

与累加器:

accLen([_|T],A,L) :- Anew is A+1, accLen(T,Anew,L).
accLen([],A,A).
Run Code Online (Sandbox Code Playgroud)

我无法理解,这两个片段在概念上有何不同?累加器到底有什么不同?有什么好处?

蓄能器听起来像中间变量.(如果我错了,请纠正我.)到目前为止,我已经在我的程序中使用过它们,所以它真的是一个很大的概念吗?

recursion tail-recursion prolog accumulator

9
推荐指数
3
解决办法
3968
查看次数

是一个无限的清单?

在Prolog中,统一X = [1|X]是一种获得无限列表的理智方式吗?SWI-Prolog没有任何问题,但GNU Prolog只是挂起.

我知道在大多数情况下我可以替换列表

one(1).
one(X) :- one(X).
Run Code Online (Sandbox Code Playgroud)

但我的问题是明确是否可以X = [1|X], member(Y, X), Y = 1在"理智"的Prolog实现中使用该表达式.

list prolog cyclic iso-prolog coinduction

7
推荐指数
1
解决办法
629
查看次数

Prolog `shift`/`reset` 与其他语言有何不同?

我在这里找到了 Haskell 中移位重置分隔延续的示例:

resetT $ do
    alfa
    bravo
    x <- shiftT $ \esc -> do
       charlie
       lift $ esc 1
       delta
       lift $ esc 2
       return 0
    zulu x
Run Code Online (Sandbox Code Playgroud)

这会:

  1. 履行alfa

  2. 履行bravo

  3. 履行charlie

  4. 绑定x到1,从而执行zulu 1

  5. 从末尾掉下来resetT,然后跳回到后面esc 1

  6. 履行delta

  7. 绑定x到2,从而执行zulu 2

  8. 从末尾掉下来resetT,然后跳回到后面esc 2

  9. 逃离resetT,导致它产生 0

我不知道如何使用 SWI-Prolog 的shift/1reset/3编写等效代码。

下面的代码是我的尝试。输出是相同的,但看起来很混乱和倒退,我觉得我误用了与Haskell 示例中的和Ball类似的东西。另外,我不知道该怎么办。esc 1esc 2return 0 …

continuations haskell prolog swi-prolog delimited-continuations

7
推荐指数
1
解决办法
291
查看次数

`var(A)`和执行顺序

本页上的练习09 http://www.ic.unicamp.br/~meidanis/courses/mc336/2009s2/prolog/problemas/要求创建一个谓词,将重复的元素打包到子列表中.

一个直截了当的解决方案很简单

pack([], []).
pack([H|T], [I|U]) :-
    split(H, T, I, P),
    pack(P, U).
Run Code Online (Sandbox Code Playgroud)

split split(Head, Tail, HeadGroup, Rest)的定义为

split(A, [], [A], []).
split(A, [B|T], [A], [B|T]) :- A \= B.
split(A, [A|T], [A|U], B) :- split(A, T, U, B).
Run Code Online (Sandbox Code Playgroud)

工作正常,几乎与上述网页上提供的示例解决方案一致.

这个解决方案失败的地方是查询pack(X, [[a], [b, b]])..2个解集之间的对应关系是双射(对于每个Apack(A, B)有一个且只有一个B),所以必须有一个更好的解决方案.

解决它的一种方法是改变评估的顺序,帮助prolog根据参数的类型选择非无限分支,如下所示

pack([], []).
pack(A, B) :-
  ( var(A) ->
    A = [H|T],
    B = [I|U],
    pack(P, U),
    split(H, T, I, P)
  ; A = …
Run Code Online (Sandbox Code Playgroud)

list prolog prolog-dif logical-purity

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

Prolog测试始终是真正的var(sum)错误

我正在尝试编译一个SWI-Prolog程序,但一直在努力test is always true, var (sum) error on line 7.我无法弄清楚这意味着什么.有人可以帮忙吗?这是一个我希望最终解决拉丁方的程序.谢谢.

:- use_module(library(clpfd)).

magic_counter(Count) :-
    findall(a, magic_1(_Soln), As),
    length(As, Count).

magic_1(Soln) :-
    Row1 = [W1, W2, W3],
    Row2 = [X1, X2, X3],
    Row3 = [Y1, Y2, Y3],

    Row1 ins 1..3,
    Row2 ins 1..3,
    Row3 ins 1..3,

    Sum #= 6,

    all_different(Row1),
    all_different(Row2),
    all_different(Row3),

    all_different([W1,X1,Y1]),
    all_different([W2,X2,Y2]),
    all_different([W3,X3,Y3]),

    W1 + W2 + W3 #= Sum,
    X1 + X2 + X3 #= Sum,
    Y1 + Y2 + Y3 #= Sum,

    W1 + X1 …
Run Code Online (Sandbox Code Playgroud)

constraints prolog swi-prolog

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

如何在Prolog中将谓词作为参数传递给另一个谓词?

我有以下3个谓词:

times(X, Y):-
    Result is X * Y.
minus(X, Y):-
    Result is X - Y.
plus(X, Y):-
    Result is X + Y.
Run Code Online (Sandbox Code Playgroud)

我想通过例如times(2,2)plus(X, Y)这样的plus(times(2,2), minus(X, Y))

parameters expression predicate prolog

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

使谓词可逆

我是初学者; 我来自结构化编程背景,因为很明显:)

我正在构建一个涉及撤消数字的序言查询; 例如.reverse_num(123,X)结果X = 321.我提出了以下定义,但它仅在我提供数字作为第一个参数时才有效.

reverse_num(Num, Revnum) :-
  number_chars(Num, Atoms),
  reverse(Revatoms, Atoms),
  number_chars(Reversed, Revatoms),
  Reversed = Revnum.
Run Code Online (Sandbox Code Playgroud)

number_chars/2如果我做的话,谓词不喜欢未经证实的变量:( reverse_num(X,123)我期待X的是321).

我是否努力使reverse_num做一些不应该做的事情(应该理解它只能用数字作为第一个参数而变量作为第二个)?

或者是否有一种简单/直接的方式来处理变量作为第一个参数?

prolog

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

在Prolog中轻松复制元素:)

我正在研究一个更长的问题,我在列表表单中复制了N次元素,我相信使用append是正确的方法.这个小谓词理论上应该是这样的:

?- repl(x,5,L).
L = [x, x, x, x, x] ;
false.
Run Code Online (Sandbox Code Playgroud)

我似乎无法在网上找到任何提示,复制单个元素,但我相信我们需要使用append,但没有递归解决方案.我来自更多的Haskell背景,这个问题会更容易执行.有人可以帮我开始吗?:)

我的目前为止:

repl(E, N, R) :-
    N > 0, append([E], [], R), writeln(R), repl(E, N-1, R), fail.
Run Code Online (Sandbox Code Playgroud)

这给了我:

?- repl(x,5,L).
[x]
[x]
[x]
[x]
[x]
false.
Run Code Online (Sandbox Code Playgroud)

关闭但不完全!

list prolog duplicates replicate

4
推荐指数
1
解决办法
2970
查看次数

SVN菜单未显示在Spring工具套件中

我正在使用Mac OS X版本10.9.我安装了SVN版本1.8.8.另外我在我的STS中使用Subclipse 1.10.4作为插件.我安装了SVNKit v1.8.4.10145以及作为客户端SVN接口安装的JavaHL(JNI)1.8.8(r1568071).

不幸的是,我无法在我的STS中看到SVN菜单右键单击我工作区中的JAVA文件并导航到Team子菜单.

我尝试过很多东西但似乎没什么用.

任何人都知道这里有什么问题?

subclipse svn javahl spring-tool-suite

3
推荐指数
1
解决办法
3344
查看次数