私は、キーストアを管理するリレーショナルプロローグプログラムを書いています。最初のコードは、インターネット上で見つかった講義スライドの一部から取っています(http://people.eng.unimelb.edu.au/pstuckey/book/course.html - 参照:データ構造スライドを参照)。純粋にリレーショナルなプロローグプログラムを書くにあたっては、丁寧に配置されたカットを使用してもよいですか?
このコードでは、同じキーで複数の値を追加することができます。ただし、同じキーと値のペアを2回追加します(例:
?- newdic(D), addkey(D, a, 1, D2), addkey(D2, a, 1, D3), lookup(D3, a, X).
D = [],
D2 = [p(a, 1)],
D3 = [p(a, 1), p(a, 1)],
X = 1
D3はp(a、1)を2回含む。
これが起こらないように、次のコードを追加しました。バックトラックが代替のaddkey節を見つけられないようにするために、私は最初の節の最後にカットを追加しました。
純粋なリレーショナルプログラムのための公正なゲームか、重複したキーと値のペアが追加されないように、より良い方法です。
newdic([]).
addkey(D0,K,I,D0) :- lookup(D0, K, I), !. % if the key already do nothing
addkey(D0,K,I,D) :- D = [p(K,I)|D0].
delkey([],_,[]).
delkey([p(K,_)|D],K,D).
delkey([p(K0,I)|D0],K,[p(K0,I)|D]) :-
dif(K, K0), delkey(D0,K,D).
これは次のようにつながる:
?- newdic(D), addkey(D, a, 1, D2), addkey(D2, a, 1, D3), lookup(D3, a, X).
D = [],
D2 = D3, D3 = [p(a, 1)],
X = 1.
いいえ、より多くのソリューションが用意されています - プログラムはすぐに戻ります。
任意の提案がはるかに高く評価され、
ダニエル
注:脇のように:私は同じキー異なる値に対して追加した場合、カットは同じのために第2の値を識別するためにバックトラックすることができないことキー:
?- newdic(D), addkey(D, a, 1, D2), addkey(D2, a, 1, D3), addkey(D3, a, 2, D4), lookup(D4, a, X).
D = [],
D2 = D3, D3 = [p(a, 1)],
D4 = [p(a, 2), p(a, 1)],
X = 2 ;
D = [],
D2 = D3, D3 = [p(a, 1)],
D4 = [p(a, 2), p(a, 1)],
X = 1.
一度しか成功しないようにするには、 'once(lookup(D0、K、I))'のようなものを使うことができます。 – lurker
現在の回答に本当に満足していますか?結局のところ、あなたは何か違うことを尋ねます。 – false