1

私はこれを持っています

initialstate(0,[],[[1,0],[2,3],[1,2],[2,3]]).

リスト内のどのサブリストが番号1と同じかを見つけたいと思います。そして、番号1のサブリストを削除した後。

それは次のようなものです:

?- initialstate(_,_,[X,_]), initialstate(_,_,list),
 delete(list,X,Newlist),assertz(initialstate(A,B,Newlist)).

これが間違っていることはわかっていますが、私がやりたいことを説明しようとしています。

最終的なリストを次のようにしたい:

initialstate(0,[],[[2,3],[2,3]]).
4

2 に答える 2

1

正しいビルトイン (delete/3) を選択したと思いますが、細部が間違っています。これが実際の「クエリ」です。

?- retract(initialstate(A,B,C)), C=[[X,_]|_], delete(C,[X,_],Newlist), assertz(initialstate(A,B,Newlist)).
A = 0,
B = [],
C = [[1, 0], [2, 3], [1, 2], [2, 3]],
X = 1,
Newlist = [[2, 3], [2, 3]].

まず第一に、最初にリトラクトを実行せずに assertz を実行すると、データがほぼ複製されてしまい、おそらくそれはあなたが望むものではありません。assertz は、更新された initialstateを古いものの後に保存します (asserta はありますが、バグが修正されるとは思えません)。

次に、パターン マッチングを使用して重要な情報を抽出する方法に注意してください。

C=[[X,_]|_]

_ (つまり、無名変数) の使用は必須です。これは、複雑な構造のどの部分を使用するときに無視する必要があるかを指定できるためです。また、delete/3 に何を一致させるかを示すためにも使用する必要があります。

delete(C,[X,_],Newlist)
于 2013-10-10T05:44:32.673 に答える