Prolog检查谓词类别

时间:2017-03-21 20:34:42

标签: prolog

我从今天开始与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).

1 个答案:

答案 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.

这可用于所有方向