gpt4 book ai didi

prolog - 我怎么能在 Prolog 中为同一个原子有两个名字?

转载 作者:行者123 更新时间:2023-12-04 15:06:57 24 4
gpt4 key购买 nike

我想在 Prolog 中为同一个原子有两个名称:

player(thomas).
player(william).
teamOfPlayer(thomas, redSocks).
teamOfPlayer(william, redSocks).
tom :- thomas.
will :- william.

teamOfPlayer(will, X).

我希望能够使用“william”原子和“will”原子来指代威廉。

我知道我可以使用仿函数来定义昵称:
nick(tom, thomas).
nick(will, william).

进而,
nick(tom,X), teamOfPlayer(X, Y).

但我想避免所有这些冗长。

最佳答案

实现特定的设施可用于此目的 - 以及更多。事实上,鉴于身份是逻辑的“核心”,重写规则以适应不同的身份识别策略并不是一个不常见的问题。

在 SWI-Prolog 中,您可以使用 expansion hooks ,更具体地说 goal_expansion/2。

在您的模块中,在文件末尾附近添加(不过只是一个约定)

:- multifile user:goal_expansion/2.
user:goal_expansion(will, william).
user:goal_expansion(tom, thomas).

编辑

对不起,我没有调试我的建议,结果证明是不正确的。
可能的更正可能是:

alias(will,william).
alias(tom,thomas).

:- multifile user:goal_expansion/2.
user:goal_expansion(player(X), player(Y)) :-
alias(X,Y).
user:goal_expansion(teamOfPlayer(X,T), teamOfPlayer(Y,T)) :-
alias(X,Y).

我们可以使重载规则更通用,但问题深深 Root 于语言核心。原子具有 的基本属性(从关系数据模型的角度来看)身份 ,那么我们只能在 中“重载”一个原子具体上下文。

关于prolog - 我怎么能在 Prolog 中为同一个原子有两个名字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49288905/

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