5

それぞれの人に名前と年齢を与える次の知識ベースがあると想像してください。

person(mary, 39).
person(john, 24).
person(sandy, 17).

ここで、20 歳以上のすべての人を取得したいと考えています。さらに、年齢ではなく名前を収集したいだけです。maryここでは、 と を取得したいと思いますjohn

これを一般的に Prolog で、より具体的には SWI-Prolog で行う方法は?

次のように、匿名ではない変数を使用する場合:

?- person(X, Y), Y > 20.

XProlog は、とYと I do not wantの両方の値を教えてくれますY

_Prolog は 2 つのインスタンス化をリンクできないため、無名変数を使用できません。以下はエラーになります。

?- person(X, _), _ > 20.

それで、これを行う方法は?

4

3 に答える 3

6

この回答は、@danielp によるこの以前の回答の直接のフォローアップです。

を使用すると、次のいずれかを使用できます。

  • すべての変数の回答置換を表示します (デフォルト)

  • 次のような変数の回答置換を表示しません_A

詳しくは、お使いの Prolog プロセッサのマニュアルをご覧ください。

SWIの場合:環境制御 (Prolog フラグ)current_prolog_flag/2. set_prolog_flag/2.

stefan@Lenovo ~ $ swipl
SWI-Prolog (マルチスレッド、64 ビット、バージョン 7.3.15) へようこそ
...

?- current_prolog_flag ( toplevel_print_anon、フラグ)。% get default
 Flag = true .

?- _A = 1。
_A = 1。

?- _A = 1、X = _A。
_A = X、X = 1。

?- set_prolog_flag (toplevel_print_anon、false)。%トグルフラグ
真実。

?- current_prolog_flag(toplevel_print_anon, フラグ)。
フラグ = false。

?- _A = 1. %注意!
真実。

?- _A = 1、X = _A。
X = 1。

?- set_prolog_flag(toplevel_print_anon, true)。% 復元フラグ
真実。

?- current_prolog_flag(toplevel_print_anon, フラグ)。
フラグ = true。

?- _A = 1。
_A = 1。

?- _A = 1、X = _A。
_A = X、X = 1。
于 2016-01-21T07:07:25.457 に答える
5

述語を定義しない理由

ofintrest(X):- person(X,Y),Y>20.

クエリ

ofintrest(X).

述語を定義したくない場合は、二重否定を使用することもできます

person(X,_) ,\+(\+ (person(X,Y), Y>20))
于 2016-01-20T06:05:24.757 に答える
2

CAFEBABE's answerに既に投稿されている述語を定義できます。_または、値が回答に表示されない変数に で始まる名前を付けることもできます (既に述べたように、の出現_は常に異なる変数です)。

person(X,_Age), _Age > 20.

更新: これは Prolog の実装に固有のものです。SICStus では機能しますが、デフォルトでは SWI では機能しません ( repeat's answerを参照)。

于 2016-01-20T07:00:50.567 に答える