标签: failure-slice

更好地终止s(X)-sum

(让我在中期问题的浪潮中偷偷摸摸.)

两个自然数之和的通用定义是nat_nat_sum/3:

nat_nat_sum(0, N, N).
nat_nat_sum(s(M), N, s(O)) :-
   nat_nat_sum(M, N, O).
Run Code Online (Sandbox Code Playgroud)

严格来说,这个定义过于笼统,因为我们现在也取得了成功

?- nat_nat_sum(A, B, unnatural_number).
Run Code Online (Sandbox Code Playgroud)

同样,我们得到以下答案替代:

?- nat_nat_sum(0, A, B).
   A = B.
Run Code Online (Sandbox Code Playgroud)

我们将此答案替换解释为包括所有自然数,而不关心其他术语.

鉴于此,现在让我们考虑它的终止属性.实际上,考虑以下故障切片就足够了.也就是说nat_nat_sum/3,如果此切片未终止,则不仅不会终止.这次他们完全一样!所以我们可以说iff.

nat_nat_sum(0, N, N) :- false.
nat_nat_sum(s(M), N, s(O)) :-
   nat_nat_sum(M, N, O), false.

这个失败切片现在暴露了第一个和第三个参数之间的对称性:它们都以完全相同的方式影响非终止!因此,虽然他们描述了完全不同的东西 - 一个是加数,另一个是和 - 它们对终止具有完全相同的影响.可怜的第二个论点没有任何影响.

可以肯定的是,不仅故障片在其读取的公共终止条件(使用cTI)中是相同的

nat_nat_sum(A,B,C)terminates_if b(A);b(C).
Run Code Online (Sandbox Code Playgroud)

对于那些未被这种情况覆盖的情况,它也会完全相同,例如

?- nat_nat_sum(f(X),Y,Z).
Run Code Online (Sandbox Code Playgroud)

现在我的问题:

是否有另一个定义nat_nat_sum/3具有终止条件:

nat_nat_sum2(A,B,C) terminates_if b(A);b(B);b(C).
Run Code Online (Sandbox Code Playgroud)

(如果是,请显示.如果不是,请说明理由)

换句话说,如果新定义的一个参数是有限的和基础的,则新定义nat_nat_sum2/3应该终止.


细则.只考虑纯粹的,单调的Prolog程序.也就是说,除了(=)/2和之外没有内置插件 …

termination prolog successor-arithmetics failure-slice

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

Prolog谓词 - 无限循环

我需要用自然数来创建一个2的幂的Prolog谓词.自然数是:0,s(0),s(s(0))ans等等.

例如:

?- pow2(s(0),P).
P = s(s(0));
false.
?- pow2(P,s(s(0))).
P = s(0);
false.
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

times2(X,Y) :-
  add(X,X,Y).

pow2(0,s(0)).
pow2(s(N),Y) :-
  pow2(N,Z),
  times2(Z,Y).
Run Code Online (Sandbox Code Playgroud)

并且它与第一个示例完美配合,但在第二个示例中进入无限循环.
我该如何解决这个问题?

prolog exponentiation successor-arithmetics non-termination failure-slice

5
推荐指数
2
解决办法
1206
查看次数

为什么我在Prolog Fib/2中的谓语总是说"超出本地堆栈"?

我写了一个谓词fib/2来计算Prolog中的Fibonacci数.虽然它有效,但它总是说"超出本地堆栈"并且错误看起来像:

?- fib(10, F).
F = 55 ;
ERROR: Out of local stack
Run Code Online (Sandbox Code Playgroud)

我的谓词如下:

fib(0, 0).
fib(1, 1).
fib(N, NF) :-
    A is N - 1, 
    B is N - 2,
    fib(A, AF), 
    fib(B, BF),
    NF is AF + BF.
Run Code Online (Sandbox Code Playgroud)

任何人都知道这是为什么以及如何解决它以获得以下的东西::

% or the search might stop immediately, without pressing space.
?- fib2(10, F).
F = 55 ;
false. 
Run Code Online (Sandbox Code Playgroud)

提前致谢!

stack prolog fibonacci failure-slice

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

SWI Prolog不会终止

:- use_module(library(clpfd)).

fact(treated=A) :- A in 0..1.
fact(numYears=B) :- B in 0..sup.
fact(numDrugs=C) :- C in 0..sup.
fact(treated2=D) :- D in 0..1.
fact(cParam=E) :- E in 0..4.

is_differentfact(X,X) :- false.
is_differentfact(Element=_,OtherElement=_) :-
    dif(Element,OtherElement).

is_fakt([]).
is_fakt([X|Xs]) :-
    fact(X),
    maplist(is_differentfact(X),Xs),
    is_fakt(Xs).
Run Code Online (Sandbox Code Playgroud)

为什么?- is_fakt(X)返回一个结果列表的答案,但在一些结果答案后它会挂起.我不知道为什么Prolog无法返回X的所有可能值.

prolog clpfd failure-slice prolog-dif

5
推荐指数
2
解决办法
932
查看次数

可逆树长度关系

我试图在"纯粹的"Prolog中写出可逆关系(没有is,剪切或类似的东西.是的,它是家庭作业),我必须承认我不知道如何.我没有看到任何创建这样的事情的过程.

我们被赋予"不可知"但可逆的算术关系(add,mult,equal,less,...),我们必须使用它们来创建这些关系.

现在我正在尝试通过创建关系来了解如何创建可逆函数,tree(List,Tree)如果List是二叉树的叶子列表则为true Tree.

为了实现我试图创造这样的事情tree_size(Tree,N)时,这是真正的关系TreeN叶子.这是我天真的,不可逆转的关系:

tree_len(n(_,leaf,leaf),1).
tree_len(n(op,G,D),N) :-
    tree_len(G,TG),
    tree_len(D,TD),
    add(TG,TD,N).
Run Code Online (Sandbox Code Playgroud)

我可以进行查询tree_len(some tree, N),但不是说tree_len(X,3),所以它不可逆.到目前为止,我已经尝试了一些事情,但我必须承认我感到气馁,因为我不知道在哪里寻找什么.有没有办法做到这一点?

prolog successor-arithmetics clpfd failure-slice

5
推荐指数
2
解决办法
268
查看次数

在prolog中,为什么不添加"edge(X,Y): - edge(Y,X)".单独工作将有向图定义转换为无向图

我正在学习Prolog,我正在复习讲义,所有笔记都说:

给定有向图的以下定义:

path(X, Y) :- edge(X, Y).
path(X, Y) :- edge(X, Z), path(Z, Y).
Run Code Online (Sandbox Code Playgroud)

如果我们想让它成为一个无向图,edge(X, Y) :- edge(Y, X).单独定义 不起作用,我无法弄清楚为什么.如果Y到X有边,则X到Y有一条边.似乎对我有意义.

这些说明并没有真正说明原因,但它确实定义了正确的解决方案:

edge1(X, Y) :- edge(X, Y).
edge1(X, Y) :- edge(Y, X). 
Run Code Online (Sandbox Code Playgroud)

我们已经拥有的东西.

谁能解释一下这个,请和谢谢?<3

prolog transitive-closure failure-slice

5
推荐指数
2
解决办法
223
查看次数

使用Prolog将单个列表拆分为三个

我正在尝试创建一个函数,将可变长度列表按顺序拆分为三个偶数长度列表.以下将其拆分为三个,但进程一次一个地将它们插入到每个列表中.

我想要的一个例子是:

[1, 2, 3, 4, 5] -> [1, 2], [3, 4], [5]
Run Code Online (Sandbox Code Playgroud)

另一个例子是:

[8, 7, 6, 5, 4, 3, 2, 1] -> [8, 7, 6], [5, 4, 3], [2, 1].
Run Code Online (Sandbox Code Playgroud)

以下代码通过一次插入一个列表来拆分它们:

div([], [], [], []).
div([X], [X], [], []).
div([X,Y], [X], [Y], []).
div([X,Y,Z|End], [X|XEnd], [Y|YEnd], [Z|ZEnd]):-
  div(End, XEnd, YEnd, ZEnd).
Run Code Online (Sandbox Code Playgroud)

此代码输出:

[1, 2, 3, 4, 5] -> [1, 4], [2, 5], [3]
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

prolog failure-slice

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

查找图中节点之间的路径及其长度

我正在尝试解决这个问题,我已经阅读了这个答案,但我的问题是无限循环,即使我使用了访问节点列表。

让我们看看我的两次尝试:

edge(1,2).
edge(1,4).
edge(1,3).
edge(2,3).
edge(2,5).
edge(3,4).
edge(3,5).
edge(4,5).


% ------ simple path finding in a directed graph

% -----  simple exploration

path0(A,B, Result) :-
    path0(A, B, [], Result).

path0(A, B, _, [e(A,B)]):- 
    edge(A,B).    
path0(A, B, Visited, [e(A,X)|Path]):-
    edge(A, X), dif(X, B),
    \+ member(X, Visited),
    path0(X, B, [A|Visited], Path ).    


%---- 1. exploration and length    

path(A, B, _, [e(A,B)], 1):- 
    edge(A,B).    
path(A, B, Visited, [e(A,X)|Path], Length):-
    edge(A, X),
    \+ member(X, Visited),
    length(Path, L),        % ERR: Path refers …
Run Code Online (Sandbox Code Playgroud)

graph-theory prolog shortest-path non-termination failure-slice

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

Prolog CLPFD中的整数和无限循环列表

假设我想表示这样的整数:integer:Sign:[FirstDigit,SecondDigit,...].例如,42表示为integer:positive:[4,2].

我需要一个谓词,它根据这个表示生成整数的值,反之亦然.

这是我想出的:

integer_value_('integer':Sign:[H],E) :-
    H in 0..9,
    (
        Sign = 'positive',
        E #= H
        ;
        Sign = 'negative',
        E #= -H
    ).
integer_value_('integer':Sign:[H,I|T],E) :-
    H in 0..9,
    length([I|T],L),
    (
        Sign = 'positive',
        E #= F + H * 10^L
        ;
        Sign = 'negative',
        E #= F - H * 10^L
    ),
    integer_value_('integer':Sign:[I|T],F).
Run Code Online (Sandbox Code Playgroud)

这按预期工作.然而,它具有接受诸如integer:positive:[0,1]在列表开头的前导零之类的事情的不幸特性.当我使用integer_value_(I,J), label([J]).以下列举所有可能的整数时,这尤其成问题:带有前导零的那些也会出现.

然后,我试图通过integer_value_仅使用除第一个数字之外的所有数据来解决这个问题,并使用integer_value第一个数字(请记住,我们需要容纳0表示只包含0的列表):

integer_value('integer':Sign:[H],E) :-
    abs(E) #< 10,
    abs(E) #> -1,
    integer_value_('integer':Sign:[H],E).
integer_value('integer':Sign:[H,I|T],E) :-
    H …
Run Code Online (Sandbox Code Playgroud)

prolog infinite-loop clpfd failure-slice

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

如何实现所有参数模式的列表项删除?

以下 Prolog 程序定义了一个谓词,deleted/3用于从第二个参数中传递的列表中删除第一个参数中传递的所有出现的项目,并生成第三个参数中传递的列表:

\n
deleted(_, [], []).\ndeleted(X, [X|Y], Z) :-\n  deleted(X, Y, Z).\ndeleted(U, [V|W], [V|X]) :-\n  deleted(U, W, X),\n  U \\= V.\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. 它适用于此参数模式下的查询:
  2. \n
\n
?- deleted(a, [a, b, a], [b]).\n   true\n;  false.\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. 它也适用于此参数模式下的查询:
  2. \n
\n
?- deleted(X, [a, b, a], [b]).\n   X = a\n;  false.\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. 它也适用于此参数模式下的查询:
  2. \n
\n
?- deleted(a, [a, b, a], Z).\n   Z = [b]\n;  false.\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. 它也适用于此参数模式下的查询:
  2. \n
\n
?- deleted(X, [a, b, a], Z).\n   X = …
Run Code Online (Sandbox Code Playgroud)

termination prolog sequence failure-slice logical-purity

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