Prolog 人工智能语言中文论坛---打造优质Prolog学习交流园地

一个供Prolog爱好者学习与交流的地方


您没有登录。 请登录注册

請教有關於判斷Prolog的程式

浏览上一个主题 浏览下一个主题 向下  留言 [第1页/共1页]

1 請教有關於判斷Prolog的程式 于 周五 十一月 16, 2012 7:05 pm

主旨是想寫一個十個戰鬥小隊,每隊均有兩個人,查詢系統輸入成員單人的名字,可以展現出該位成員是屬於Winner(無敗績的全勝者)還是Fighter(有贏有輸的鬥士)甚至是Sportsman(幾乎都輸了擁有運動家精神的者)
(簡單範例)
team(teamate(ryu),
teamate(chunli). %定義這個小隊成員有ryu和chunli

team(teamate(sagat),
teamate(vega). %定義這個小隊成員有sagat和vega


beat( ryu, sagat) %ryu打倒了sagat
beat( chunli, ryu)
beat( ken, sagat)

class( X, fighter) :- beat( X, _), beat(_, X), !.
class( X, winner) :- beat( X, _), !.
class( X, sportsman) :- beat(_, X).

功能主要就是假設輸入了ryu,根據裏面設定他打敗了對手,但也同時被打敗,所以會顯示他為Fighter(有贏有輸的鬥士)要怎麼寫才行呢?新手多多包含。

查阅用户资料

2 回复: 請教有關於判斷Prolog的程式 于 周六 十一月 17, 2012 2:26 am

BillZhan 写道::主旨是想寫一個十個戰鬥小隊,每隊均有兩個人,查詢系統輸入成員單人的名字,可以展現出該位成員是屬於Winner(無敗績的全勝者)還是Fighter(有贏有輸的鬥士)甚至是Sportsman(幾乎都輸了擁有運動家精神的者)
(簡單範例)
team(teamate(ryu),
teamate(chunli). %定義這個小隊成員有ryu和chunli

team(teamate(sagat),
teamate(vega). %定義這個小隊成員有sagat和vega


beat( ryu, sagat) %ryu打倒了sagat
beat( chunli, ryu)
beat( ken, sagat)

class( X, fighter) :- beat( X, _), beat(_, X), !.
class( X, winner) :- beat( X, _), !.
class( X, sportsman) :- beat(_, X).

功能主要就是假設輸入了ryu,根據裏面設定他打敗了對手,但也同時被打敗,所以會顯示他為Fighter(有贏有輸的鬥士)要怎麼寫才行呢?新手多多包含。

Sportsman定义为"幾乎都輸了擁有運動家精神的者",这里"几乎"的定义不够明确,
所以我暂时先当"几乎"的意思为"全输"。

然后感觉"分小队"这件事在程序里没起到作用啊?

下面是我写的代码:

代码:
team(teamate(ryu),
teamate(chunli)). %定義這個小隊成員有ryu和chunli

team(teamate(sagat),
teamate(vega)). %定義這個小隊成員有sagat和vega


beat( ryu, sagat). %ryu打倒了sagat
beat( chunli, ryu).
beat( ken, sagat).

class( X, fighter) :- beat( X, _), beat(_, X).
class( X, winner) :- beat(X, _), \+ beat(_, X).
class( X, sportsman) :- beat(_, X), \+ beat(X, _).

33 ?- class(ryu, C).
C = fighter ;
false.

34 ?- class(ken, C).
C = winner ;
false.

36 ?- class(A, winner).
A = chunli ;
A = ken.

37 ?- class(A, C).
A = ryu,
C = fighter ;
A = chunli,
C = winner ;
A = ken,
C = winner ;
A = sagat,
C = sportsman ;
A = sagat,
C = sportsman.

查阅用户资料 http://prolog.longluntan.net

3 回复: 請教有關於判斷Prolog的程式 于 周六 十一月 17, 2012 5:16 pm

Mercury Liao 写道::
BillZhan 写道::主旨是想寫一個十個戰鬥小隊,每隊均有兩個人,查詢系統輸入成員單人的名字,可以展現出該位成員是屬於Winner(無敗績的全勝者)還是Fighter(有贏有輸的鬥士)甚至是Sportsman(幾乎都輸了擁有運動家精神的者)
(簡單範例)
team(teamate(ryu),
teamate(chunli). %定義這個小隊成員有ryu和chunli

team(teamate(sagat),
teamate(vega). %定義這個小隊成員有sagat和vega


beat( ryu, sagat) %ryu打倒了sagat
beat( chunli, ryu)
beat( ken, sagat)

class( X, fighter) :- beat( X, _), beat(_, X), !.
class( X, winner) :- beat( X, _), !.
class( X, sportsman) :- beat(_, X).

功能主要就是假設輸入了ryu,根據裏面設定他打敗了對手,但也同時被打敗,所以會顯示他為Fighter(有贏有輸的鬥士)要怎麼寫才行呢?新手多多包含。

Sportsman定义为"幾乎都輸了擁有運動家精神的者",这里"几乎"的定义不够明确,
所以我暂时先当"几乎"的意思为"全输"。

然后感觉"分小队"这件事在程序里没起到作用啊?

下面是我写的代码:

代码:
team(teamate(ryu),
teamate(chunli)). %定義這個小隊成員有ryu和chunli

team(teamate(sagat),
teamate(vega)). %定義這個小隊成員有sagat和vega


beat( ryu, sagat). %ryu打倒了sagat
beat( chunli, ryu).
beat( ken, sagat).

class( X, fighter) :- beat( X, _), beat(_, X).
class( X, winner) :- beat(X, _), \+ beat(_, X).
class( X, sportsman) :- beat(_, X), \+ beat(X, _).

33 ?- class(ryu, C).
C = fighter ;
false.

34 ?- class(ken, C).
C = winner ;
false.

36 ?- class(A, winner).
A = chunli ;
A = ken.

37 ?- class(A, C).
A = ryu,
C = fighter ;
A = chunli,
C = winner ;
A = ken,
C = winner ;
A = sagat,
C = sportsman ;
A = sagat,
C = sportsman.

剛剛也的確發現了最前面小隊列表似乎變成沒有意義的選項...不知道有沒有辦法讓他輸出他是贏家、鬥士、輸家(目前定議沒勝場的)以外,是否還能夠增加顯示一個對名,假如:

teamA(teamate(ryu),
teamate(ken)).

teamB(teamate(lee),
teamate(chunli)).

beat( ryu, lee).
查詢ryu的時候同時也可以查到他是teamA

查阅用户资料

4 回复: 請教有關於判斷Prolog的程式 于 周六 十一月 17, 2012 5:38 pm

BillZhan 写道::
Mercury Liao 写道::
BillZhan 写道::主旨是想寫一個十個戰鬥小隊,每隊均有兩個人,查詢系統輸入成員單人的名字,可以展現出該位成員是屬於Winner(無敗績的全勝者)還是Fighter(有贏有輸的鬥士)甚至是Sportsman(幾乎都輸了擁有運動家精神的者)
(簡單範例)
team(teamate(ryu),
teamate(chunli). %定義這個小隊成員有ryu和chunli

team(teamate(sagat),
teamate(vega). %定義這個小隊成員有sagat和vega


beat( ryu, sagat) %ryu打倒了sagat
beat( chunli, ryu)
beat( ken, sagat)

class( X, fighter) :- beat( X, _), beat(_, X), !.
class( X, winner) :- beat( X, _), !.
class( X, sportsman) :- beat(_, X).

功能主要就是假設輸入了ryu,根據裏面設定他打敗了對手,但也同時被打敗,所以會顯示他為Fighter(有贏有輸的鬥士)要怎麼寫才行呢?新手多多包含。

Sportsman定义为"幾乎都輸了擁有運動家精神的者",这里"几乎"的定义不够明确,
所以我暂时先当"几乎"的意思为"全输"。

然后感觉"分小队"这件事在程序里没起到作用啊?

下面是我写的代码:

代码:
team(teamate(ryu),
teamate(chunli)). %定義這個小隊成員有ryu和chunli

team(teamate(sagat),
teamate(vega)). %定義這個小隊成員有sagat和vega


beat( ryu, sagat). %ryu打倒了sagat
beat( chunli, ryu).
beat( ken, sagat).

class( X, fighter) :- beat( X, _), beat(_, X).
class( X, winner) :- beat(X, _), \+ beat(_, X).
class( X, sportsman) :- beat(_, X), \+ beat(X, _).

33 ?- class(ryu, C).
C = fighter ;
false.

34 ?- class(ken, C).
C = winner ;
false.

36 ?- class(A, winner).
A = chunli ;
A = ken.

37 ?- class(A, C).
A = ryu,
C = fighter ;
A = chunli,
C = winner ;
A = ken,
C = winner ;
A = sagat,
C = sportsman ;
A = sagat,
C = sportsman.

剛剛也的確發現了最前面小隊列表似乎變成沒有意義的選項...不知道有沒有辦法讓他輸出他是贏家、鬥士、輸家(目前定議沒勝場的)以外,是否還能夠增加顯示一個對名,假如:

teamA(teamate(ryu),
teamate(ken)).

teamB(teamate(lee),
teamate(chunli)).

beat( ryu, lee).
查詢ryu的時候同時也可以查到他是teamA
(還未編隊名)

team(teamate(ryu),
teamate(ken)).

team(teamate(lee),
teamate(chunli)).

team(teamate(eagle),
teamate(birdie)).

team(teamate(sagat),
teamate(adon)).

team(teamate(zangief),
teamate(honda)).

team(teamate(dhalsim),
teamate(blanka)).

team(teamate(guile),
teamate(cammy)).

team(teamate(balrog),
teamate(bison)).

team(teamate(long),
teamate(hawk)).

team(teamate(gouki),
teamate(vega)).

beat( ryu, lee).
beat( lee, eagle).
beat( eagle, sagat).
beat( sagat, zangief).
beat( zangief, dhalsim).
beat( dhalsim, guile).
beat( guile, balrog).
beat( balrog, long).
beat( long, ken).
beat( ken, chunli).
beat( cuunli, birdie).
beat( honda, adon).
beat( adon, blanka).
beat( blanka, cammy).
beat( cammy, bison).
beat( hawk, bison).
beat( gouki, cammy).
beat( vega, bison).

class( X, challenger) :- beat( X, _), beat(_, X).
class( X, grandfighter) :- beat(X, _), \+ beat(_, X).
class( X, loser) :- beat(_, X), \+ beat(X, _).

查阅用户资料

5 回复: 請教有關於判斷Prolog的程式 于 周六 十一月 17, 2012 6:37 pm

你要队名就直接列在facts中。例如
team('Shouryuken', 'Ryu', 'Ken'). %Ryu, Ken列在Shouryuken队

至於最后的等级判断, challenger 这个等级很容易定义,但是,所谓 grand_fighter 若按照现在这个判断,只赢一个、两个也叫做 grand_fighter ,这样不正确。至少也该是打倒每一队至少一人
代码:

class( X, grand_fighter) :-
    team(T,X),
    setof(T1, (team(T1,_,_), T1 \= T), Ts),
    forall((member(T1,Ts), team(T1,Y,Z)),
          (beat(X,Y); beat(X,Z))).
team(T,X) :-
    team(T,X,_), !.
team(T,X) :-
    team(T,_,X).

至於 loser 名号,大概没问题。



BillZhan 写道::(還未編隊名)

team(teamate(ryu),
teamate(ken)).

team(teamate(lee),
teamate(chunli)).

team(teamate(eagle),
teamate(birdie)).

team(teamate(sagat),
teamate(adon)).

team(teamate(zangief),
teamate(honda)).

team(teamate(dhalsim),
teamate(blanka)).

team(teamate(guile),
teamate(cammy)).

team(teamate(balrog),
teamate(bison)).

team(teamate(long),
teamate(hawk)).

team(teamate(gouki),
teamate(vega)).

beat( ryu, lee).
beat( lee, eagle).
beat( eagle, sagat).
beat( sagat, zangief).
beat( zangief, dhalsim).
beat( dhalsim, guile).
beat( guile, balrog).
beat( balrog, long).
beat( long, ken).
beat( ken, chunli).
beat( cuunli, birdie).
beat( honda, adon).
beat( adon, blanka).
beat( blanka, cammy).
beat( cammy, bison).
beat( hawk, bison).
beat( gouki, cammy).
beat( vega, bison).

class( X, challenger) :- beat( X, _), beat(_, X).
class( X, grand fighter) :- beat(X, _), \+ beat(_, X).
class( X, loser) :- beat(_, X), \+ beat(X, _).

查阅用户资料 http://yauhsien.wordpress.com

6 回复: 請教有關於判斷Prolog的程式 于 周三 十一月 21, 2012 4:58 pm

yauhsien 写道::你要队名就直接列在facts中。例如
team('Shouryuken', 'Ryu', 'Ken'). %Ryu, Ken列在Shouryuken队

至於最后的等级判断, challenger 这个等级很容易定义,但是,所谓 grand_fighter 若按照现在这个判断,只赢一个、两个也叫做 grand_fighter ,这样不正确。至少也该是打倒每一队至少一人
代码:

class( X, grand_fighter) :-
    team(T,X),
    setof(T1, (team(T1,_,_), T1 \= T), Ts),
    forall((member(T1,Ts), team(T1,Y,Z)),
          (beat(X,Y); beat(X,Z))).
team(T,X) :-
    team(T,X,_), !.
team(T,X) :-
    team(T,_,X).

至於 loser 名号,大概没问题。



BillZhan 写道::(還未編隊名)

team(teamate(ryu),
teamate(ken)).

team(teamate(lee),
teamate(chunli)).

team(teamate(eagle),
teamate(birdie)).

team(teamate(sagat),
teamate(adon)).

team(teamate(zangief),
teamate(honda)).

team(teamate(dhalsim),
teamate(blanka)).

team(teamate(guile),
teamate(cammy)).

team(teamate(balrog),
teamate(bison)).

team(teamate(long),
teamate(hawk)).

team(teamate(gouki),
teamate(vega)).

beat( ryu, lee).
beat( lee, eagle).
beat( eagle, sagat).
beat( sagat, zangief).
beat( zangief, dhalsim).
beat( dhalsim, guile).
beat( guile, balrog).
beat( balrog, long).
beat( long, ken).
beat( ken, chunli).
beat( cuunli, birdie).
beat( honda, adon).
beat( adon, blanka).
beat( blanka, cammy).
beat( cammy, bison).
beat( hawk, bison).
beat( gouki, cammy).
beat( vega, bison).

class( X, challenger) :- beat( X, _), beat(_, X).
class( X, grand fighter) :- beat(X, _), \+ beat(_, X).
class( X, loser) :- beat(_, X), \+ beat(X, _).

簡略版寫成像是這樣子(隊伍名稱暫時簡短化)
-------------------------------------

team(teamate(ryu),
teamate(ken)).

team(teamate(lee),
teamate(chunli)).

team(teamate(eagle),
teamate(birdie)).

team(teamate(sagat),
teamate(adon)).

team(teamate(zangief),
teamate(honda)).

team(teamate(dhalsim),
teamate(blanka)).

team(teamate(guile),
teamate(cammy)).

team(teamate(balrog),
teamate(bison)).

team(teamate(long),
teamate(hawk)).

team(teamate(gouki),
teamate(vega)).

team('a', 'ryu', 'ken').

team('b', 'lee', 'chunli').

team('c', 'eagle', 'birdie').

team('d', 'sagat', 'adon').

team('e', 'zangief', 'honda').

team('f', 'dhalsim', 'blanka').

team('g', 'guile', 'cammy').

team('h', 'balrog', 'bison').

team('i', 'long', 'hawk').

team('j', 'gouki', 'vega').

beat( ryu, lee).
beat( lee, eagle).
beat( eagle, sagat).
beat( sagat, zangief).
beat( zangief, dhalsim).
beat( dhalsim, guile).
beat( guile, balrog).
beat( balrog, long).
beat( long, ken).
beat( ken, chunli).
beat( cuunli, birdie).
beat( honda, adon).
beat( adon, blanka).
beat( blanka, cammy).
beat( cammy, bison).
beat( hawk, bison).
beat( gouki, cammy).
beat( vega, bison).

class( X, challenger) :- beat( X, _), beat(_, X).
class( X, grandfighter) :- beat( X, _), !.
class( X, loser) :- beat(_, X), \+ beat(X, _).

class( X, grand_fighter) :-
team(T,X),
setof(T1, (team(T1,_,_), T1 \= T), Ts),
forall((member(T1,Ts), team(T1,Y,Z)),
(beat(X,Y); beat(X,Z))).
team(T,X) :-
team(T,X,_), !.
team(T,X) :-
team(T,_,X).

------------------------------
不知道能不能跑出來

查阅用户资料

浏览上一个主题 浏览下一个主题 返回页首  留言 [第1页/共1页]

您在这个论坛的权限:
不能在这个论坛回复主题