Prolog:编写rpg stat打印程序时的算术问题
我一直在尝试编写一个小代码片段(作为一个练习——学习一点prolog),它可以打印出纸笔RPG中特定种族的所有可能的统计组合 相关代码片段:Prolog:编写rpg stat打印程序时的算术问题,prolog,clpfd,Prolog,Clpfd,我一直在尝试编写一个小代码片段(作为一个练习——学习一点prolog),它可以打印出纸笔RPG中特定种族的所有可能的统计组合 相关代码片段: %abilities ability(X) :- member(X, [str, dex, con, int, wis, cha]). race(tiefling, planetouched, [[dex, 2], [int, 2], [cha, -2]], [infernalResistance,darkvision,skillAffinity
%abilities
ability(X) :-
member(X, [str, dex, con, int, wis, cha]).
race(tiefling, planetouched, [[dex, 2], [int, 2], [cha, -2]], [infernalResistance,darkvision,skillAffinity(bluff),skillAffinity(hide)],rogue, 1, medium).
race(human, human, [], [quickToMaster, skilled], any, 0, medium).
racialAttributeBonus(Race, Stat, Bonus) :-
race(Race, _, BonusList, _, _, _, _),
member([Stat, Bonus], BonusList).
racialAttributeBonus(Race, Stat, 0) :-
race(Race, _, BonusList, _, _, _, _),
\+ member([Stat, _], BonusList).
%start ability points is 32
%first 6 points - 1 point per increase
%7, 8 - +2 per increase
%9, 10 - +3 per increase
statDiffCost(Diff, Cost) :-
Range = [Diff, Cost],
member(Range, [
[0, 0],
[1, 1],
[2, 2],
[3, 3],
[4, 4],
[5, 5],
[6, 6],
[7, 8],
[8, 10],
[9, 13],
[10, 16]
]).
raceAttribCost(Race, AttrName, AttrValue, Cost) :-
number(AttrValue),
racialAttributeBonus(Race, AttrName, Bonus),
AttrDiff is AttrValue - Bonus - 8,
statDiffCost(AttrDiff, Cost).
raceAttribCost(Race, AttrName, AttrValue, Cost) :-
number(Cost),
racialAttributeBonus(Race, AttrName, Bonus),
statDiffCost(AttrDiff, Cost),
AttrValue is AttrDiff + Bonus + 8.
raceAttributes(Race, Str, Dex, Con, Int, Wis, Cha) :-
StrCost + DexCost + ConCost + IntCost + WisCost + ChaCost is 32,
raceAttribCost(Race, str, Str, StrCost),
raceAttribCost(Race, dex, Dex, DexCost),
raceAttribCost(Race, con, Con, ConCost),
raceAttribCost(Race, int, Int, IntCost),
raceAttribCost(Race, wis, Wis, WisCost),
raceAttribCost(Race, cha, Cha, ChaCost).
然而,我遇到了两个与数字/算术处理相关的问题
首先,我希望
raceAttributes(human, Str, Dex, Con, Int, Wis, Cha).
将打印参数的组合。相反,我得到了false
其次,我无法优雅地处理raceAttribCost
和statDiffCost
中的数值参数
基本上,我必须创建两个版本的raceAttribCost
,因为根据我指定的参数,其中一个需要在比较的右侧使用“实例化”变量
所以,我想知道如何
raceAttributes
实际工作raceAttribCost
的一个版本,只保留其中一个版本statDiffCost
替换为更紧凑的另外,我在windows 7上使用SWI-PL 64位。这在CLP(FD)约束下非常容易解决 对于第一个问题(为什么失败):
is/2
不适用于左侧的复合词。您需要=:=/2
来比较算术表达式的计算结果。但是,由于未实例化的变量,简单地用=:=/2
替换is/2
在您的情况下是不起作用的
要解决此问题,只需在程序中用CLP(FD)约束替换所有出现的is/2
,并在程序开始时添加:-使用_模块(库(clpfd))。
。这将产生一个更通用的程序
然后,只需删除不必要的number/1
目标,并删除多余的子句
新版本的示例查询及其结果:
?- raceAttributes(human, Str, Dex, Con, Int, Wis, Cha).
Str = Dex, Dex = Con, Con = Int, Int = 8,
Wis = Cha, Cha = 18 ;
Str = Dex, Dex = Con, Con = 8,
Int = 11,
Wis = 17,
Cha = 18 ;
Str = Dex, Dex = Con, Con = 8,
Int = 11,
Wis = 18,
Cha = 17 ;
etc.
在各个方向上都能完全按照预期工作。您可以这样操作:
:- use_module(library(clpfd)).
is
的所有用法替换为=
number/1
目标关于你的命名惯例,我还有一个额外的评论:你会发现使用下划线更容易阅读更长的名字!在C++中使用CAMELASH之后,我不太可能切换到其他任何东西,抱歉。习惯的问题,请参见C++发明者。值得注意的是:“我更喜欢用下划线来分隔标识符中的单词(例如,代码> EntEngEngult),而不是替代方案,如<代码> EntaleCuth和
:-use_module(library(clpfd))。
,以便CLP(FD)约束在顶层自动对我可用,这与GNU Prolog和B-Prolog等其他知名系统中非常相似。