我有这个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)'不是一个函数”。有人可以向我解释这意味着什么吗?
答案 0 :(得分:7)
如果我可以在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
我怀疑你认为该条款是&#34;查找玩家X的T和W并返回W / T * 100.&#34; Prolog实际上认为你说的是什么& #34;在玩家X上查找T和W,或在某个时间内查找某些事情<&lt; 尴尬停顿&gt;&#34;这不是特别有意义。当你问winrate(player47)
时,Prolog会站在角落里,双手插在口袋里,然后说'呃,真的吗?&#34;
更正是:
winrate(X, Rate) :- player(X, T, W, _), Rate is (W/T) * 100.
newbie/1
et中你有一个完全相同的问题。 al。:winrate(X) < 40
在Prolog中没有内在含义,因为没有&#34;返回值&#34;在Prolog。更正后的表达式为winrate(X, WinRate), WinRate < 40.
请注意,Prolog中的最后一个参数没有什么特别之处。具有单向语义的谓词使用结果的最后一个参数是常见的,但它并不是真正的法律,而Prolog并没有在那里强制执行任何操作。
密切关注单例变量错误。如果没有变量出现多次,Prolog中没有任何有意义的事情发生,所以如果你得到这个错误并立即用_
替换命名变量,你的子句似乎仍然有足够的信息来完成它的工作吗?如果没有,你几乎肯定会错过一些东西或者对Prolog的语义感到困惑。相信我,我从经验中学到了这一点。