Prolog 序言:临时列表存储
我不熟悉Prolog,我被困在一个谓词上,我正试图做这个谓词。它的目的是递归通过一个给定P的四边形列表[X,Y,S,P],当四边形具有相同的P时,它将其存储在一个临时列表中。当它遇到一个新的P时,它会查看临时列表是否大于长度2,如果大于长度2,则将临时列表存储在输出列表中,如果小于2,则删除四元组,然后在新的P中再次开始递归。Prolog 序言:临时列表存储,prolog,prolog-dif,Prolog,Prolog Dif,我不熟悉Prolog,我被困在一个谓词上,我正试图做这个谓词。它的目的是递归通过一个给定P的四边形列表[X,Y,S,P],当四边形具有相同的P时,它将其存储在一个临时列表中。当它遇到一个新的P时,它会查看临时列表是否大于长度2,如果大于长度2,则将临时列表存储在输出列表中,如果小于2,则删除四元组,然后在新的P中再次开始递归。 这是我的密码: deleteUP(_,[],[],[]). deleteUP(P,[[X,Y,S,P]|Rest],Temp,Output):-
这是我的密码:
deleteUP(_,[],[],[]).
deleteUP(P,[[X,Y,S,P]|Rest],Temp,Output):-
!,
appends([X,Y,S,P],Temp,Temp),
deleteUP(P,[Rest],Temp,Output).
deleteUP(NextP,[[X,Y,S,P]|Rest],Temp,Output):-
NextP =\= P,
listlen(Temp,Z),
Z > 1, !,
appends(Temp,Output,Output),
deleteUP(NextP,[_|Rest],Temp,Output).
listlen([], 0).
listlen([_|T],N) :-
listlen(T,N1),
N is N1 + 1.
appends([],L,L).
appends([H|T],L,[H|Result]):-
appends(T,L,Result).
谢谢你的帮助 Prolog变量无法“修改”,因为您正在尝试调用appends:您需要一个新的变量来放置结果。请注意,此代码未经测试
deleteUP(_,[],[],[]).
deleteUP(P,[[X,Y,S,P]|Rest],Temp,Output):-
!,
appends([X,Y,S,P],Temp,Temp1),
deleteUP(P, Rest, Temp1,Output). % was deleteUP(P,[Rest],Temp,Output).
deleteUP(NextP,[[X,Y,S,P]|Rest],Temp,Output1):-
% NextP =\= P, should be useless given the test in clause above
listlen(Temp,Z),
Z > 1, !, % else ?
deleteUP(NextP,[_|Rest],Temp,Output),
appends(Temp,Output,Output1).
您的问题描述涉及存储、递归和启动。这是一个非常必要的程序性描述。试着首先关注关系应该描述什么。实际上,我还不明白2的最小长度是多少 考虑使用预定义的
append/3
和length/2
代替您自己的定义。但实际上,在您的示例中,这两个都不是必需的
您可能需要使用专用结构q(X,Y,S,p)
来代替列表[X,Y,S,p]
目标附录([X,Y,S,p],Temp,Temp)
表明您假设逻辑变量Temp
可以像命令式语言中的变量一样使用。但事实并非如此。默认情况下,SWI在这里创建了一个非常奇怪的结构,称为“无限树”。暂时忘掉这件事
?- append([X,Y,S,P],Temp,Temp).
Temp = [X, Y, S, P|Temp].
?-附加([X,Y,S,P],温度,温度)。
温度=[X,Y,S,P |温度]。
SWI中有一种安全的方法可以避免此类情况,并自动检测(部分)此类错误。打开电源检查
?- set_prolog_flag(occurs_check,error).
true.
?- append([X,Y,S,P],Temp,Temp).
ERROR: lists:append/3: Cannot unify _G392 with [_G395,_G398,_G401,_G404|_G392]: would create an infinite tree
?-设置prolog标志(发生检查错误)。
对。
?-附加([X,Y,S,P],温度,温度)。
错误:列表:追加/3:无法将_G392与[_G395、_G398、_G401、_G404 | _G392]统一:将创建一个无限树
目标=\=/2
表示算术不等式,您可能更喜欢dif/2
避免使用代码>-在这种情况下不需要它
length(L,N),N>1
通常更好地表示为L=[[uuu,124; uu]
然而,主要问题是第三和第四个论点应该是什么。你真的需要首先澄清这一点