gpt4 book ai didi

prolog - 不是函数警告

转载 作者:行者123 更新时间:2023-12-04 23:42:21 26 4
gpt4 key购买 nike

我有这个 Prolog 程序,我想将玩家与具有相同级别(新手、中级或专家)和服务器的玩家相匹配:

player(player29, 408, 183, europe).
player(player30, 462, 97, north-america).
player(player31, 25, 22, asia).
player(player32, 481, 248, asia).
player(player33, 111, 37, asia).
player(player34, 424, 359, north-america).
player(player35, 381, 358, asia).
player(player36, 231, 159, africa).
player(player37, 31, 20, africa).
player(player38, 22, 21, africa).
player(player39, 144, 35, oceania).
player(player40, 30, 25, asia).
player(player41, 221, 112, south-america).
player(player42, 344, 292, africa).
player(player43, 183, 148, asia).
player(player44, 62, 40, africa).
player(player45, 281, 23, north-america).
player(player46, 308, 173, south-america).
player(player47, 127, 125, asia).
player(player48, 441, 393, south-america).
player(player49, 213, 48, oceania).
player(player50, 343, 145, africa).

winrate(X):-player(X, T, W, _); (W/T) * 100.

newbie(X):-winrate(X) < 40.
intermediate(X):-winrate(X) >=40; winrate(X) < 80.
expert(X):-winrate(X) > 80.

但是,当我编译它时,我收到一条警告说“算术:'winrate(_G1082)'不是一个函数”。有人可以向我解释这是什么意思吗?

最佳答案

如果我能指出 Prolog 中的一个误解是有史以来最大的初学者绊脚石,那就是:Prolog 中没有返回值这样的东西。所以问题归结为这个定义:

winrate(X) :- player(X, T, W, _); (W/T) * 100.

如果你只在 Prolog 中输入它,你会收到一条看起来很神秘的警告信息:
Warning: user://1:9:
Singleton variable in branch: T
Singleton variable in branch: W

我怀疑您认为该条款是“为玩家 X 查找 T 和 W 并返回 W/T * 100”。 Prolog实际上认为你说的是​​“为玩家X查找T和W,或者超过一百倍<尴尬的暂停>”,这并不是特别有意义。当你问 winrate(player47) , Prolog 会双手插在口袋里站在角落里说“嗯,真的吗?”

更正是这样的:
winrate(X, Rate) :- player(X, T, W, _), Rate is (W/T) * 100.

您在 newbie/1 中遇到了完全相同的问题。等。其他: winrate(X) < 40在 Prolog 中没有内在意义,因为 Prolog 中没有“返回值”。更正后的表达式为 winrate(X, WinRate), WinRate < 40.
请注意,Prolog 中的最后一个参数没有什么特别之处。具有单向语义的谓词使用最后一个参数作为结果是很常见的,但这并不是真正的法律,Prolog 没有在那里强制执行任何事情。

密切注意单例变量错误。如果变量出现多次,Prolog 中没有任何有意义的事情发生,因此如果您收到此错误并立即将命名变量替换为 _ ,你的子句似乎还有足够的信息来完成它的工作吗?如果没有,您几乎肯定错过了某些东西或对 Prolog 的语义感到困惑。相信我,我从经验中学到了这一点。

关于prolog - 不是函数警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34011930/

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