2016-04-19 7 views
1

私は以下の基礎知識を持っています: "少なくとも3つのNBA選手権を獲得した30歳以上のNBA選手はスーパースターです。 30歳以下のNBA選手は、ビデオゲームの表紙に表示される場合、またはTwitterに少なくとも5百万人の信者がいる場合にのみ、スーパースターです。 "学習プログラム(カット、リスト、否定)は、正しい方向に私をプッシュします

具体的な人物に適用すると、各クエリに1つの回答(真/偽)を与える単項述語スーパースターを定義します。スーパースター(ポーガソル)。ルールは一度だけファクトをチェックする必要があります(たとえば、クエリされた人の年齢を2回確認しないでください)。 ";"演算子は使用できません。

あなたは、あなたのテストで、これらのデータを使用することができます(これらの8人の選手の4が前の定義によれば、スーパースターです):

age(kobeBryant,37). 
championships(kobeBryant,5). 
millionsFollowers(kobeBryant,9). 
age(pauGasol,35). 
championships(pauGasol,2). 
videogameCover(pauGasol). 
millionsFollowers(pauGasol,3). 
age(marcGasol,31). 
videogameCover(marcGasol). 
millionsFollowers(marcGasol,1). 
age(stephenCurry,28). 
championships(stephenCurry,1). 
videogameCover(stephenCurry). 
millionsFollowers(stephenCurry,5). 
age(klayThompson,26). 
championships(klayThompson,1). 
age(kevinDurant,27). 
millionsFollowers(kevinDurant,13). 
age(russellWestbrook,27). 
videogameCover(russellWestbrook). 
millionsFollowers(russellWestbrook,3). 
age(dwayneWade,29). 
championships(dwayneWade,3). 
millionsFollowers(dwayneWade,4). 

だから何私がやったことは、このでした:我々

superstar(X):- age(X,Y), Y>=30, championships(X,Z), Z>=3,!. 
superstar(X):- age(X,Y), Y=<30, videogameCover(X),!. 
superstar(X):- millionsFollowers(X,Z), Z>=5. 

学習されたリスト、カット、否定の最後のレッスンです。 誰かが私に何を正しい方向に押してもらえますか?そのため、年齢は一度しかチェックされません。もしそれが大きければ、30は片方向になり、30は他の方法になります。 私は解決策を求めていない、私はプッシュ、ヒントを求めています。

私はそれを理解するとき、解決策を自分自身でうまく投稿します。

+1

すべての正直なところ、正しい方向はこの具体的なコースから離れています。ほんの少しのヒント:Prologは*宣言的な言語ですが、インストラクターはあなたに命令的な操作について考えるようになりました。与えられた事実は、 'unreadableNamesLikeInJava'ではなく' all_use_underscores'という他のすべてのProlog述語の命名規則に従いません。これらの問題に加えて、低レベルの算術、否定、 '!/ 0'を使用するように教えられています。私はこれまで、初心者には不適切で非宣言的な仕事が与えられたことはなかった。私のヒントは、より良いインストラクターを見つけることです。 – mat

+0

:))ありがとう、ああ、ああ、ああ、ああ、ああああああ)私は期待した明日を書くだろう不幸の幸福のああ。 –

+0

要件を満たすための簡単な解決策は、 'setof/3'を使って事実を収集することです(PA、年齢(P、A)、PA)。」のように、また他の事実と同様に、いくつかのリストが含まれています。 (この述語には 'person_age/2'がどのように*もっと*適切な名前になったのか注意してください!)その後、それ以上の制限が課されないので、任意の方法でリストを歩くことができます。完全に無意味で逆効果的な仕事に対する恐ろしい解決策。この意味で、良いフィット感...上記から判断すると、あなたのインストラクターはこの方法でもそれを解決することができるかもしれません。 – mat

答えて

0

を私はこれが好きでした:

superstar(A) :- age(A,B), B>=30, !, championships(A,C), C>=3. 
superstar(A) :- videogameCover(A),!. 
superstar(A) :- millionsFollowers(A,B), B>=5. 

これは先生がそれを望んでいた方法です、それはより簡単にできる何かのために複雑にする方法であるようです:

+0

'!/ 0'を使うと、これらのプログラムは一般的には不完全なものになります。たとえば、 '? - superstar(X).'というクエリは、多くの場合、カバーに表示される30以下のスーパースターがいくつあっても、単一の解決策しか報告しません。良いプロローグの教師は、そのような宣言的なプロパティの違反によって引き起こされた重大な欠点を指摘するでしょう。これは、CLP(FD)制約を使用することが非常に適切である良い例です。 – mat

0

DBテーブルに一度だけアクセスする要求は、AND/OR検索ツリーを正規化します。事前条件を区別するためにサービス述語を導入することができます。

superstar(X) :- age(X,Y), age_check(X,Y). 

今、カットを使用して、あなたが実際にブランチに

age_check(X,Y) :- Y>=30, !, championships(X,Z), Z>=3. 
% other 2 rules for age_check, actually not using Y 

をコミットするか、カットを避けるが、正しいドメイン論理和使用することができます。最後に

age_check(X,Y) :- Y>=30, championships(X,Z), Z>=3. 
age_check(X,Y) :- Y<30, etc etc 
... 
関連する問題