我有以下基础知识: “拥有至少3次NBA总冠军的30岁以上的NBA球员都是超级巨星。 30岁以下的NBA球员只有当他们出现在电子游戏的封面上或者他们在Twitter上至少拥有500万粉丝时才是超级明星。“
定义一个一元谓词超级明星,当应用于具体的人时,例如每个查询只给出一个答案(真/假),例如:巨星(pauGasol)。规则应该只检查一次事实(例如,他们不应该检查被查询者的年龄两次)。您不能使用“;”运算符。
您可以在测试中使用这些数据(根据之前的定义,这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种,而另一种方式则是另一种方式一般。 我不是要求解决方案,我要求推动,提示。
当我想出来时,我会希望自己发布解决方案。
答案 0 :(得分: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
...
答案 1 :(得分:0)
最后我这样做了:
superstar(A) :- age(A,B), B>=30, !, championships(A,C), C>=3.
superstar(A) :- videogameCover(A),!.
superstar(A) :- millionsFollowers(A,B), B>=5.
这就是老师想要的样子,似乎这样可以让事情变得简单:
trichampion(X) :- championships(X,Z), Z>=3.
socialmediastar(X) :- millionsFollowers(X,Z), Z>=5.
superstar(X) :- age(X,Y), Y>=30,!,trichampion(X).
superstar(X) :- videogameCover(X),!.
superstar(X) :- socialmediastar(X).