gpt4 book ai didi

oop - SWI-Prolog 中的面向对象编程

转载 作者:行者123 更新时间:2023-12-03 23:32:01 24 4
gpt4 key购买 nike

我在某处读到,您可以将模块视为 Prolog 中的对象。我正在努力解决这个问题,以及它是否是一种编码的好方法。

如果我有两个文件,一个定义一个类 dog,然后另一个使用这个类来创建两个 dog 对象。

:- module(dog,
[ create_dog/4,bark/1 ]).

create_dog(Name,Age,Type,Dog):-
Dog = dog(name(Name),age(Age),type(Type)).

bark(Dog):-
Dog = dog(name(_Name),age(_Age),type(Type)),
Type = bassethound,
woof.
bark(Dog):-
Dog = dog(name(_Name),age(_Age),type(Type)),
Type \= bassethound,
ruff.

woof:-format("woof~n").

ruff:-format("ruff~n").

第二个文件
use_module(library(dog)).

run:-
dog:create_dog('fred',5,bassethound,Dog),
forall(between(1,5,_X),
dog:bark(Dog)
),
dog:create_dog('fido',6,bloodhound,Dog2),
dog:bark(Dog2).

这使狗对象狗是巴塞特猎犬并使其吠叫 5 次,
然后我制作另一只狗对象 Dog2,它是一只猎犬,并让它也吠叫。我知道在 oop 中,您有具有行为和状态的对象。所以我现在有两个基于它们自己的状态具有不同行为的对象,但目前我将对象的状态存储在 Dog 变量中,它们可以在主程序中的代码中看到。有没有办法隐藏对象的状态,即拥有私有(private)变量?
例如,我可能想要一种存储每个狗对象的状态 has_barked 的方法,如果它在程序中较早地吠叫则为真,否则为假,然后更改 bark/1 的行为基于此。

另外,您将如何处理继承和覆盖方法等?
欢迎任何指向读数的指针。谢谢你。

最佳答案

Prolog 模块可以简单地解释为对象(特别是原型(prototype))。 Prolog 模块可以动态创建,具有可以被视为其身份的名称(因为它在运行 session 中必须是唯一的,因为模块 namespace 是平面的),并且可以具有动态状态(使用模块本地的动态谓词)。然而,在大多数系统中,它们提供了弱封装,因为您通常可以使用显式限定来调用任何模块谓词(也就是说,至少有一个系统 ECLiPSe 允许您锁定模块以防止以这种方式破坏封装)。也不支持将接口(interface)与实现分离或具有同一接口(interface)的多个实现(您可以以某种方式破解它,这取决于 Prolog 模块系统,但它并不漂亮)。
正如其他答案中提到的,Logtalk 是 Prolog 的一个高度可移植的面向对象的扩展,支持大多数系统,包括 SWI-Prolog。从概念和实践的角度来看,Logtalk 对象包含 Prolog 模块。 Logtalk 编译器支持模块功能的共同核心。您可以使用它,例如在没有模块系统的 Prolog 实现中编写模块代码。 Logtalk 可以将模块编译为对象,并支持对象和模块之间的双向调用。
请注意,逻辑编程中的对象最好被视为一种代码封装和代码重用机制。就像模块一样。 OO 概念可以(并且已经)成功地应用于其他编程范例,包括功能和逻辑。但这并不意味着一定要引入命令/程序概念。例如,实例与其类之间或作为其父对象的原型(prototype)之间的关系可以解释为指定代码重用模式,而不是从动态/状态的角度来看(实际上,在 OOP 语言中)派生自命令式/过程式语言,实例只不过是一种美化的动态数据结构,其规范分布在其类及其类父类(super class)之间)。
考虑到您的示例代码,您可以在接近您的公式的 Logtalk 中轻松重新编码它,但也可以通过其他方式重新编码,其中最有趣的是不使用动态功能。存储状态(如动态状态)有时是必要的,甚至可能是特定问题的最佳解决方案(Prolog 有动态谓词是有原因的!)但应谨慎使用,并且仅在真正必要时使用。使用 Logtalk 不会改变(也不打算改变)这一点。
我建议您查看广泛的 Logtalk 文档及其众多编程示例。在那里你会找到如何例如将接口(interface)与实现完全分离,如何使用组合、继承、专门化或覆盖继承的谓词等。

关于oop - SWI-Prolog 中的面向对象编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28154041/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com