我在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) 我有这个代码使用一个上限变量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) 我需要找到给定数字的因子,例如:
?- 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中实现一个非常简单的约束自由语法时遇到了无限递归问题.
这是我的规则:(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) 我需要从列表的头部和尾部找到列表中的最大整数.我已经写了一个程序,可以找到最大的头部现在我需要一些帮助从尾部做到这一点.
这是我到目前为止:
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)
请记住,这会从头部找到最大的整数,我需要它从尾部开始工作.谢谢您的帮助.
我必须编写 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) 我必须找到列表中的两个成员是否相邻.限制是使用append/3谓词.到目前为止,我已经完成了下面的工作,如果它是真的可行,否则我得不到答案,就像它永远运行一样.
adjacent(X,Y,L):-
append(L1,[X,Y],T1),append(T1,T2,L).
Run Code Online (Sandbox Code Playgroud) 给定一组通过谓词Parent/2表示父子关系的事实,使用谓词pred1/2和pred2/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) 我试图匹配一些句子(例如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)
不行.
任何帮助将不胜感激,谢谢!
我试图了解 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).
failure-slice ×10
prolog ×10
dcg ×3
list ×1
parent-child ×1
parsing ×1
pythagorean ×1
recursion ×1