标签: failure-slice

Prolog:错误的全局堆栈与看起来像一级递归给我

我在prolog中很生疏,但我不确定为什么这样的事情会失败:

frack(3).

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

所以,如果我评估frack(4).从交互式提示中定义了上述事实,我希望它不应该无休止地递归,因为4-1 = 3.但是我在SWI-Prolog中得到了这个错误:

ERROR: Out of global stack
Run Code Online (Sandbox Code Playgroud)

prolog failure-slice

4
推荐指数
2
解决办法
244
查看次数

Prolog:毕达哥拉斯三重奏

我有这个代码使用一个上限变量N,它应该终止为毕达哥拉斯三元组的X和Y. 然而它只有在达到上限时才会冻结.不知道如何使用切割来阻止回溯.代码是:

is_int(0).
is_int(X) :- is_int(Y), X is Y+1.
minus(S,S,0).
minus(S,D1,D2) :- S>0, S1 is S-1, minus(S1,D1,D3), D2 is D3+1.

pythag(X,Y,Z,N) :- int_triple(X,Y,Z,N), Z*Z =:= X*X + Y*Y.

int_triple(X,Y,Z,N) :- is_int(S), minus(S,X,S1), X>0, X<N,
                                  minus(S1,Y,Z), Y>0, Y<N.
Run Code Online (Sandbox Code Playgroud)

将被称为,例如,

?- pythag(X,Y,Z,20).
Run Code Online (Sandbox Code Playgroud)

prolog pythagorean failure-slice

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

Prolog - 得到给定数字的因素不会停止?

我需要找到给定数字的因子,例如:

?- divisors2(40,R).
R = [40,20,10,8,5,4,2,1].
Run Code Online (Sandbox Code Playgroud)

代码 :

% get all the numbers between 1-X 
range(I,I,[I]).
range(I,K,[I|L]) :- I < K, I1 is I + 1, range(I1,K,L).
% calc the modulo of each element with the given number :
% any x%y=0 would be considered as part of the answer 
divisors1([],[],_).
divisors1([H|T],S,X):-divisors1(T,W,X),Z is X mod H,Z==0,S=[H|W].
divisors1([_|T],S,X):-divisors1(T,S,X).
divisors2(X,Result) :-range(1,X,Result1),divisors1(Result1,Result,X).
Run Code Online (Sandbox Code Playgroud)

但是当我跑步时,divisors2(40,RR).我得到无限循环,并且屏幕上没有任何内容.

为什么?

问候

prolog failure-slice program-slicing

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

英语约束免费语法序言

我试图在prolog中实现一个非常简单的约束自由语法时遇到了无限递归问题.

这是我的规则:(vp - >动词短语,np - >名词短语,ap - > adj短语,pp - >预备短语)

    verb(S) :- member(S, [put,  pickup, stack, unstack]).
    det(S) :- member(S, [the]).
    adj(S) :- member(S, [big, small, green, red, yellow, blue]).
    noun(S) :- member(S, [block, table]).
    prep(S) :- member(S, [on, from]).

    vp([V|R]) :- verb(V), pp(PP), np(NP), append(NP, PP, R).
    np([D, N]) :- det(D), noun(N).
    np([D|R]) :- det(D), ap(AP), noun(N), append(AP, [N], R).
    ap([A]) :- adj(A).
    ap([A|R]) :- adj(A), ap(R).
    pp([P|R]) :- prep(P), np(R).
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是ap的规则可以产生任意长的形容词串,所以在某些时候,我试图通过尝试所有这些无限的可能性来试图满足查询.

例如,以下查询将永远不会产生S = [put,the,red,block,on,the,green,block],因为它会首先将左侧"红色"上的形容词短语扩展为无限可能性,然后再尝试对.

?- …
Run Code Online (Sandbox Code Playgroud)

prolog infinite-loop left-recursion dcg failure-slice

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

Prolog从尾部查找列表中的最大整数

我需要从列表的头部和尾部找到列表中的最大整数.我已经写了一个程序,可以找到最大的头部现在我需要一些帮助从尾部做到这一点.

这是我到目前为止:

largest([X],X).
largest([X|Xs],X) :- largest(Xs,Y), X>=Y.
largest([X|Xs],N) :- largest(Xs,N), N>X.
Run Code Online (Sandbox Code Playgroud)

请记住,这会从头部找到最大的整数,我需要它从尾部开始工作.谢谢您的帮助.

tail-recursion list prolog failure-slice

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

解析 Prolog 中的表达式并返回抽象语法

我必须编写 parse(Tkns, T) ,它以标记列表的形式接受数学表达式并找到 T,并返回一个表示抽象语法的语句,尊重操作顺序和关联性。

例如,

?- parse( [ num(3), plus, num(2), star, num(1) ], T ).

T = add(integer(3), multiply(integer(2), integer(1))) ;
No
Run Code Online (Sandbox Code Playgroud)

我试图实现 + 和 * 如下

parse([num(X)], integer(X)).
parse(Tkns, T) :-
  (  append(E1, [plus|E2], Tkns),
     parse(E1, T1),
     parse(E2, T2),
     T = add(T1,T2)
  ;  append(E1, [star|E2], Tkns),
     parse(E1, T1),
     parse(E2, T2),
     T = multiply(T1,T2)
  ).
Run Code Online (Sandbox Code Playgroud)

哪个找到正确的答案,但也返回不遵循关联性或操作顺序的答案。

前任)

parse( [ num(3), plus, num(2), star, num(1) ], T ). 
Run Code Online (Sandbox Code Playgroud)

也返回

mult(add(integer(3), integer(2)), integer(1))
Run Code Online (Sandbox Code Playgroud)

parse([num(1), plus, num(2), plus, num(3)], T) …
Run Code Online (Sandbox Code Playgroud)

parsing prolog dcg failure-slice

4
推荐指数
2
解决办法
2106
查看次数

查找相邻成员

我必须找到列表中的两个成员是否相邻.限制是使用append/3谓词.到目前为止,我已经完成了下面的工作,如果它是真的可行,否则我得不到答案,就像它永远运行一样.

adjacent(X,Y,L):-
   append(L1,[X,Y],T1),append(T1,T2,L).
Run Code Online (Sandbox Code Playgroud)

prolog failure-slice

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

Prolog - 祖谓词实现的 2 种方法

给定一组通过谓词Parent/2表示父子关系的事实,使用谓词pred1/2pred2/2定义关系“祖先”(祖先)时有什么区别,如下所示?

pred1(X,Z) :- parent(X,Z).
pred1(X,Z) :- parent(X,Y), pred1(Y,Z).

pred2(X,Z) :- parent(X,Z).
pred2(X,Z) :- parent(Y,Z), pred2(X,Y).
Run Code Online (Sandbox Code Playgroud)

prolog parent-child transitive-closure failure-slice

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

Prolog DCG:匹配链上的不同符号

我试图匹配一些句子(例如001 [0,0,1],(1 +(1/0))['(',1,+,'(',1,/,0,')' ,')'], 等等.

我已经让自己跟随小型DCG了.

g3 --> s3.
s3 --> e3.

e3 --> eAdd.
e3 --> eMin.
e3 --> eMul.
e3 --> eDiv.
e3 --> n3.

eAdd --> ['('],e3,['+'],e3,[')'].
eMin --> ['('],e3,['-'],e3,[')'].
eMul --> ['('],e3,['*'],e3,[')'].
eDiv --> ['('],e3,['/'],e3,[')'].


n3 --> d3.
n3 --> n3,d3.
d3 --> [0].
d3 --> [1].
Run Code Online (Sandbox Code Playgroud)

现在我的问题是,它与使用 - ,*或/的句子不匹配,但它仅适用于使用+的递归句子.

例如:

phrase(g3,['(',1,'+','(',1,'+',1,')',')']).
Run Code Online (Sandbox Code Playgroud)

会工作,但是

phrase(g3,['(',1,'+','(',1,'/',1,')',')']).
Run Code Online (Sandbox Code Playgroud)

不行.

任何帮助将不胜感激,谢谢!

recursion prolog left-recursion dcg failure-slice

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

更好地理解序言

我试图了解 Prolog 以及它如何使用解析算法。我有这个例子,我发现:

hates(1, 2).
hates(2, 3).
hates(3, 4).
jealous(A, B) :- jealous(A, C), jealous(C,B).
jealous(A,B) :- hates(A,B).
Run Code Online (Sandbox Code Playgroud)

但是当我试图说jealous(1,4)然后它不断溢出并且永远不会产生真时,这很奇怪,好像1讨厌2,2讨厌3,3讨厌4,那么1也应该讨厌4。

但是我尝试改变它,所以它是这样的:

hates(1, 2).
hates(2, 3).
hates(3, 4).
jealous(A,B) :- hates(A,B).
jealous(A, B) :- jealous(A, C), jealous(C,B).
Run Code Online (Sandbox Code Playgroud)

然后当我说jealous(1,4).

prolog transitive-closure failure-slice

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