1

これが私の数独プロジェクトのリストです。次のようなリストがあります。

L = [_G1-0:0:0,_G19-0:6:2,_G22-0:7:2,_G25-0:8:2].

そして、これをフィルタリングして、自由変数のみを取得したいと思います。

[_G1, _G19, _G22 and _G25].

それが欲しいので、私はこの述語を書きました:

remove_position([], []) :- !.
remove_position([X-_|Xs], [X|Rs]) :- remove_position(Xs, Rs).

電話するとき

?- remove_position(L, Result).

SWI-Prologの回答

false.

だから私は述語を少し編集しました:

remove_position([], []) :- !.
remove_position([X-_:_:_|Xs], [X|Rs]) :- remove_position(Xs, Rs).

そして今、それは期待通りに動作します:

?- remove_position(L, Result).
Result = [_G1, _G19, _G22, _G25].

それでも、最初のものの何が問題なのかわかりません。私にとって、SWI-Prologは0:0:0と_、および_:_:_と一致する必要があります。わからないものはありますか?それともSWI-Prologのバグですか?

悟りをありがとう!

4

1 に答える 1

4

括弧のない用語がある場合_G1-2:3:4、その用語がどのように解析されるかを知るために、演算子の結合性と優先順位を考慮する必要があります。

用語は、ではなく_G1-2:3:4と同じであるため、との統合は失敗します。(_G1-2):(3:4)_G1-(2:3:4)_G1-2:3:4X-_

のように用語に括弧を追加すると_G1-(2:3:4)、元のremove_position/2述語が機能します。

于 2011-11-23T11:28:38.440 に答える