如何使用逻辑编程实现交互式程序(例如游戏/模拟)?


20

我听说逻辑编程可以用作其他编程范例(例如OO或函数式编程)的通用替代品。(因为Prolog是图灵完整的,所以一定是这样!)

但是,我很难看到如何实现交互式程序,例如Prolog或类似语言的简单图形控制台游戏。您具有事实,可以推导出更多事实的规则以及可以检索事实的查询。很容易看出如何使用这些基本元素来创建诸如数独求解器之类的东西。但是吃豆人,或者更简单地说是Pong呢?

请注意:我不是在寻找底层细节,而是在概念上进行概述。(例如:从高级的角度来说,您将如何处理I / O?如何存储游戏状态?如何实现“主循环”之类的东西?如何测量和响应时间流逝? )


1
我真的很喜欢您的问题-我很久以前就对Prolog感到兴奋,并问了我同样的问题,却从未想过这样做的方法。
克里斯汀·索尔

我亲自运行了一个逻辑编程课程,在SWI Prolog中实现了Frozen Bubbles克隆。就像一个魅力一样工作(第十天之后生产力下降了,因为仅仅玩它比添加功能更有趣)。uni网站链接已损坏,但我将尝试查看是否可以再次使用该代码。
Kilian Foth

2
“由于Prolog是图灵完整的,所以一定是这样!” - 并不是的。Prolog是图灵完备的,意味着Prolog 可以计算任何可以由Turing Machine计算的自然数的数学函数。但这并没有说明不是自然数上的数学函数的算法。例如:操作系统是自然数的数学函数吗?网络服务器?一个游戏?打印到控制台?驾驶机器人?我毫不怀疑,所有这些工作都可以在Prolog中完成,但是不一定要遵循Prolog的图灵完备性。
约尔格W¯¯米塔格

@JörgWMittag:换句话说,可能是可行的,只是可能不可行?
罗伯特·哈维

1
@JörgWMittag-是的,所有这些人,从本质上来说,都只是数学和数字的存储。
Bobson,2013年

Answers:


9

跟踪游戏状态与任何其他Prolog程序中的跟踪状态没有什么不同。您定义事实,然后使用它们做出决策。它已经很老了,但是“ 探索序言:冒险,物体,动物和税收 ”一文很好地解释了这在游戏中的工作方式。从文章总结:

% Set up - you start in a house
location(you, house).

% Move to a new location.
goto(X) :- 
    location(you, L), % Read your current location into L
    connect(L, X), % Check if you can reach the new location X from L
    retract( location(you, L) ), % Remove the old location fact
    assert( location(you, X) ). % Add a new location fact. You are in X now.
    write($ You are in the $), write(X), nl.

除此之外,您还需要一个图形和IO库。可能会有包含它们的商业Prolog发行版​​。我最熟悉SWI Prolog,所以我建议使用plOpenGL作为起点。它不仅使您能够访问OpenGL的渲染功能,还包括鼠标和键盘事件的绑定。例如,要处理按Escape键的操作,可以定义如下键盘规则:

% 27 is ASCII Code for Escape
keyboard(27,_,_) :-
    write('Escape key was pressed...'),nl.

看看plOpenGL的移动灯示例,了解更多详细信息以及处理鼠标移动的示例。

如果使用图形库,它可能会为您处理游戏循环。基本上,您将控制权转给该库,并提供适当的规则以执行:设置,重绘,IO事件等。如果要限制FPS或基于时间有条件地运行代码,则可以使用时间/日期来跟踪经过的时间谓词并据此做出决策。

有很多Prolog风格,因此,这当然不是制作游戏的唯一方法。不同的发行版和相关语言将使用不同的库/绑定,这可能会鼓励使用不同的方法。此外,多语种程序员可能会鼓励您使用更“图形友好”的宿主语言/运行时来管理渲染和IO,同时使用Prolog对游戏实体的行为和决策进行建模。


1
您链接到的同一站点还包含一个较长的教程,《 Prolog中的Adventure》,我发现它很有用,并且以简单的基于文本的冒险游戏的开发为结尾。
jscs 2013年

大!这就是我想要的。我确实感到,将带有副作用的操作(如write)包含在“逻辑谓词”中似乎会使这个概念偏离很多。
Alex D

2

Corbin的答案之上:通常,可以使用断言/收回谓词在Prolog中存储/检索状态。但是,有许多非标准选项,例如保存到RDF,XML,关系数据库等中。如果要GUI ,SWI-Prolog提供的XPCE就是一个例子。

请注意,尽管在Logic Programming中实现完整的游戏是一个不错的练习,但实际上它的性能是不够的,这就是为什么SWI-Prolog之类的供应商提供对较低级语言(例如Java,C ++等)的绑定的原因。即使实现简单的Sudoku求解器,也需要使用 CLP库。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.