2

次の問題があります。

プロローグ プログ:

man(thomas, 2010).
man(leon, 2011).
man(thomas, 2012).
man(Man) :- once(man(Man, _).

問題:

?- man(thomas).
true ;        %i want only on true even if there are more "thomas" *working because of once()*

?- man(X).
X = thomas ;  %i want all man to be listed *isn't working*

ゴール:

?- man(thomas).
true ;

?- man(X).
X = thomas ;
X = leon ;
X = thomas ;

なぜこれが起こるのか理解していますが、それでもすべての人の名前を知りたい. したがって、私の解決策は、「Man」が初期化されているかどうかを確認することです。

man(Man) :- (->check<-,once(man(Man, _)); man(Man, _).

「チェック」では、変数「Man」が満たされているかどうかをチェックするコードをスナイプする必要があります。

これは可能ですか?

4

2 に答える 2

4
man(X) :-
   setof(t,Y^man(X,Y),_).

さらに、これにより、冗長な回答/解決策が削除されます。

ビルトインsetof/3は、最後の引数で、最初の引数で見つかったソリューションのソートされたリストを記述します。そして、ゴールの自由変数の異なるインスタンス化ごとに。自由変数は、最初の引数にも存在変数としても出現しないものです– の左側の項です(^)/2

私たちの場合、これは、最後の引数が常に[t]興味のないものになることを意味します。したがって、_.

ゴールで発生する 2 つの変数はXYです。または、より正確に言うと、Xとに含まれる変数ですYYは存在変数です。

自由変数は だけですX。したがって、すべてのソリューションはX冗長性なしで列挙されます。多くの実装では、この具体的なケースでたまたまソートされる正確な順序に依存できないことに注意してください。

于 2014-01-06T01:05:59.967 に答える