2012-04-19 7 views
0

私はPrologを初めて使っています。私は、自分がやろうとしている述語に固執しています。その目的は、クワッド[X、Y、S、P]のリストを特定のPで再帰させることです。クワッドが同じPを持つとき、それを一時的なリストに格納します。新しいPを参照すると、テンポラリ・リストが長さ2より大きいかどうかが調べられます。テンポラリ・リストが出力リストに格納されている場合、2未満の場合はクワッドが削除され、再帰が再開されます。新しいP.
HERESに私のコード:任意の助けProlog:一時的なリストの記憶

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

ありがとう!

答えて

0

追加変数を呼び出そうとするときに、プロローグ変数を「変更」することはできません。結果を配置するための新しい変数が必要です。このコードはテストされていないことに注意してください。

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). 
1

問題の説明では、格納、再帰、開始について説明しています。それは非常に命令的で手続き的な記述です。最初に、関係が何を記述すべきかに焦点を当ててみてください。実際には、私はまだ2の最小長さについて理解していません。

独自の定義の代わりに、定義済みのappend/3length/2を使用することを検討してください。しかし実際には、あなたの例では両方とも必要ではありません。

リスト[X,Y,S,P]の代わりに専用構造q(X,Y,S,P)を使用すると便利です。

目標appends([X,Y,S,P],Temp,Temp)は、論理変数Tempを命令型言語の変数のように使用できると仮定していることを示しています。しかし、そうではありません。デフォルトでは、SWIはここで「無限木」と呼ばれる非常に奇妙な構造を作成します。今はこれを忘れてください。

 
?- append([X,Y,S,P],Temp,Temp). 
Temp = [X, Y, S, P|Temp]. 

このようなケースを避けるために、自動的に(の一部)このようなエラーを検出するために、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 

目標=\=/2は算術不平等を意味し、あなたの代わりにdif/2を好むかもしれません。

!は避けてください。この場合は不要です。

length(L, N), N > 1は、多くの場合、L = [_,_|_]としてよく表現されます。

しかし、大きな問題は、第3引数と第4引数がどのようなものであるかです。最初にそれを明確にする必要があります。