我从今天开始与Prolog合作,并希望创建一个简单的测试用例。基本的想法是定义多个体育,它看起来如下:
soccer :- category(ball_sport),
check(has_11_players_per_team),
check(large_ball),
check(use_feet).
tennis :- category(ball_sport),
...
category(ball_sport) :-
check(has_a_ball).
现在我想创建一个测试用例,看看这两个体育项目是否属于ball_sport类别,但是不知道要相互检查这些体育运动..我认为它会像下面的代码一样,但显然不是。有没有简单的方法来检查这些谓词类别?感谢
both_ballsports(sport_one, sport_two) :-
has_category(sport_one, ball_sport),
has_category_sport_two, ball_sport).
答案 0 :(得分:1)
首先,您似乎要以声明方式声明某项运动的属性。
例如:
sport_attributes(soccer, [ball_sport,players(22),ball(large),use(feet)]). sport_attributes(tennis, [ball_sport,players(2),players(4),ball(small),use(racket)]).
请注意,我将运动与属性相关联。相比之下,你使用的check(X)
形式的目标似乎缺乏一个关键的论点,即他们持有(或不是)的实际运动。例如,目标check(use_feet)
要么包含要么,但没有办法限定这种一元谓词,并说明不同体育的不同事实。
注意命名约定:我们描述每个参数的含义,用下划线分隔。
通过此表示,both_ballsports/2
可能如下所示:
both_ballsports(Sport1, Sport2) :- ballsport(Sport1), ballsport(Sport2). ballsport(Sport) :- sport_attributes(Sport, As), member(ball(_), As).
示例查询和回答:
?- both_ballsports(Sport1, Sport2). Sport1 = Sport2, Sport2 = soccer ; Sport1 = soccer, Sport2 = tennis ; Sport1 = tennis, Sport2 = soccer ; Sport1 = Sport2, Sport2 = tennis ; false.
这可用于所有方向!