0

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

助けてくれてありがとう!

4

2 に答える 2

1

問題の説明では、保存、再帰、および開始について説明しています。これは非常に命令的で手続き的な説明です。最初に、関係が何を説明するかに焦点を当てるようにしてください。実は、最小の長さ 2 が何なのか、私はまだ理解していません。

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

q(X,Y,S,P)list の代わりに専用の構造体を使用することもできます[X,Y,S,P]

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

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

SWI には、このようなケースを回避し、そのようなエラー (の一部) を自動的に検出する安全な方法があります。発生チェックをオンにします!

?- set_prolog_flag(occurs_check,error)。
真実。

?- append([X,Y,S,P],Temp,Temp).
エラー: リスト:append/3: _G392 を [_G395,_G398,_G401,_G404|_G392] と統合できません: 無限ツリーが作成されます

目標=\=/2は算術不等式を意味しますが、dif/2代わりに好むかもしれません。

を避けてください!- この場合は必要ありません。

length(L, N), N > 1のように表現する方がよい場合がよくありますL = [_,_|_]

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

于 2012-04-19T14:27:09.967 に答える
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).
于 2012-04-19T13:54:18.923 に答える