Prolog 序言:临时列表存储

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):-

我不熟悉Prolog,我被困在一个谓词上,我正试图做这个谓词。它的目的是递归通过一个给定P的四边形列表[X,Y,S,P],当四边形具有相同的P时,它将其存储在一个临时列表中。当它遇到一个新的P时,它会查看临时列表是否大于长度2,如果大于长度2,则将临时列表存储在输出列表中,如果小于2,则删除四元组,然后在新的P中再次开始递归。
这是我的密码:

  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]

然而,主要问题是第三和第四个论点应该是什么。你真的需要首先澄清这一点