在序言中定义 is_a 谓词?
我试图在 Prolog 中定义继承检查谓词 is_a/2
,但到目前为止我的所有试验都失败了。
只要 Y 是 X 的超类,is_a(X, Y)
谓词就应该返回 true。例如:
object(bare).
object(mammal).
object(animal).
object(bird).
is_a(bare, mammal).
is_a(mammal, animal).
is_a(bird, animal).
is_a(X, Y):- <definition goes here>.
定义应该使得以下查询将返回 true:
?- is_a(bare, animal).
true.
我尝试将其定义为 明显方式,但我陷入了无限循环:
is_a(X, Y):- X\==Y, object(X), object(Y), object(Z), is_a(X, Z), is_a(Z, Y).
有什么建议吗?
I'm trying to define the inheritance-check predicate is_a/2
in Prolog, but so far all my trials failed.
The is_a(X, Y)
predicate should return true whenever Y is a superclass of X. For example:
object(bare).
object(mammal).
object(animal).
object(bird).
is_a(bare, mammal).
is_a(mammal, animal).
is_a(bird, animal).
is_a(X, Y):- <definition goes here>.
The definition should go such that the following query will return true:
?- is_a(bare, animal).
true.
I tried to define it the obvious way, but I got stuck in infinite loops:
is_a(X, Y):- X\==Y, object(X), object(Y), object(Z), is_a(X, Z), is_a(Z, Y).
Any suggestions?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
避免无限循环的一种方法是添加一个谓词,它显示“直接”继承(无传递性),即
direct/2
。然后你可以写这样的东西:然后你会得到:
我不确定这是否正是你所要求的。
One way to avoid the infinite loop, is to add a predicate, which shows "direct" inheritance (no transitive), namely
direct/2
. Then you could write something like this:Then you get:
I'm not sure this is exactly what you ask for though.
像
编辑: 与 electrologos3 的答案相同的想法,他更努力地保持它像你的原始代码一样。
Something like
Edit: Same idea as electrologos3's answer, who tried harder to keep it like your original code.