0

指定された位置に要素を挿入し、その結果、リスト内の残りの要素の位置番号を変更する Predicate を Prolog でプログラムする必要があります。私が達成したのは、リストの最後に要素を挿入する Predicate を実装する次のコード スニペットです。データベース部門では、LIST とは別に、リスト内の要素の量を示す LONG もあります。最後に、述語を実装しようとするコードがいくつかあります。何が問題なのか誰か教えてもらえますか? 私はここで迷っています。

Domains
name=symbol
position=integer
element=integer
Database
    list(name,position,element)
    long(name,integer)

Predicates
     nondeterm inserirf(element)

Clauses
    list(b,1,1). 
    list(b,2,5). 
    list(b,3,8). 
    list(b,4,3). 
    long(b,4).
    inserirf(V):-
        long(b,X),
        Y=X+1,
        assertz(list(b,Y,V)),
        assertz(long(b,Y)),
        retract(long(b,X)),
        long(b,Q),
        list(b,Q,P),
        write(P),nl.

Goal
    inserirf(7).

私の最後の試み:

Predicates
 nondeterm inserirl(nom,pos,element)

Clauses
    list(b,1,1). 
    list(b,2,5). 
    list(b,3,8). 
    list(b,4,3).
    list(b,5,10).
    list(b,6,11). 
    long(b,6).

  inserirl(L,Pos,E):-
  long(L,Long),
  Pos > Long,
  NouLong = Long+1,
  retract( long(L,Long) ),
  assertz( list(L,Pos,NouLong) ),
  assertz( long(L,NouLong) ).


inserirl(L,Pos,E):-
    long(L,X),
    XaPassar=X-1,
    retract(llista(L,Pos,E)),
    retract( long(L,X) ),
    assertz( long(L,XaPassar) ),

    inserirl(L, XaPassar,E),
    long(L,Y),
    Y2=Y+1,
    retract( long(L,Y) ),
    assertz( long(L,Y2) ),
    assertz(llista(L,Pos,E)).

Goal
    inserirl(b,3,9).
% 3 -> position
% 9 -> element
% b -> name of list

何百もの助けに感謝します。

4

3 に答える 3

0

開始するには:

  1. 挿入された項目が最後にあるかどうかを確認します。その場合は、現在のコードを使用できます。
  2. 最後に移動しない場合: 現在最後にあるものを削除し (ただし覚えておいてください!)、再帰的に新しいアイテムを挿入してから、削除したアイテムを現在の最後に追加します (これは、コード)。
于 2012-01-05T14:57:44.407 に答える
0

基本ケースは次のとおりです。

inserirl(L,Pos,E):-
  long(L,Len),
  Pos > Len,
  NewLen is Len+1,
  retract( long(L,Len) ),
  assertz( list(L,Pos,NewLen) ),
  assertz( long(L,NewLen) ).

再帰的なケースでは、ファクトを変更してリストを 1 短くし、新しいアイテムを THAT に挿入してから、削除したアイテムを最後に戻します。

于 2012-01-09T01:01:02.953 に答える
0

「私の最後の試み」について:

  1. (最終的に)主張しようとしているリストの事実そのものを撤回するのはなぜですか?
  2. 再帰を実行する前に、リストを短くする必要があります (つまり、最後の要素を撤回して長さを置き換える) (短いリストで機能する必要があるため)。

注: 長さを追跡する必要がある long() ファクトのアサートと撤回に多くの時間を費やすことになりますが、それらのほとんどは「キャンセル」されます。より効率的なアプローチは、元の long() を撤回し、長さを引数として渡し、完了したときにのみ新しい long を再アサートすることです。しかし、最適化について心配する前に、それを機能させてください!

于 2012-01-09T16:30:28.103 に答える