Prolog:递归和拆分列表

时间:2013-11-09 05:31:13

标签: recursion prolog artificial-intelligence

我正在尝试编写一个游戏,其中程序通过数据库读取,抓取属性并向玩家询问玩家正在考虑的电影是否具有该属性。用户将回答是或否,如果是,则游戏将询问下一个属性,直到用户对每个属性都说“是”,此时程序将输出电影的名称。或者,如果用户拒绝,则游戏将移动到数据库中的下一部电影并开始询问这些属性。

当游戏找到包含所有属性的电影或者数据库中没有更多电影可以询问时,游戏结束。

这是数据库文件。

object_properties(crocodile_dundee,[comedy,australian,paul_hogan_movie]).
object_properties(flipper,[action_movie,australian, paul_hogan_movie,
-comedy]).
object_properties(jackass,[comedy,-australian]).
object_properties(the_godfather,[drama,crime,-character_batman]).
object_properties(the_dark_knight,[drama,crime,character_batman]).
object_properties(the_living_planet, [documentary,director_attenborough]).
object_properties(the_code, [documentary,nerds_love_it]).
object_properties(the_russian_revolution, [documentary,about_history]).

这是我的游戏文件。

go():-  

guess_object(0,[]).
guess_object(Obj,[A|As]) :- 
    object_categories(Obj,A).

guess_object(1).
guess_object(2).
guess_object(3).
guess_object(4).
guess_object(5).  %how do i do this specifically for the current Obj attributes?

guess(X) :- guess_object(_, X), 
    writeln('Does your object have the attribute '(X)'?'), 
    read(Input), Input=('yes') -> assert(object(X)) ; retractall(X), guess(X).

writeln('I guess that the film is: 'guess_object(Obj,_).

我遇到的主要问题:

  1. 如何将对象属性拆分为类似于guess_object(1)guess_object(5)的列表,具体取决于对象是否具有2个属性或4个属性等

  2. 如何让我的猜测(A)谓词递归,所以一旦用户说不,它会转到数据库文件中的下一个对象?

  3. 我在prolog上并不是太棒,但任何建议或指示都会受到高度赞赏,即使它只是指出了我可能犯下的一个愚蠢的错误。我也会尽我所能回答任何人的任何问题。

0 个答案:

没有答案