Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog 如何对不同事实中的数字求和?_Prolog - Fatal编程技术网

Prolog 如何对不同事实中的数字求和?

Prolog 如何对不同事实中的数字求和?,prolog,Prolog,假设我有一个游戏,里面有一个英雄和几个怪物。如果你击败了每只怪物,它们会得到一定的分数 total_score(Hero, Score):- defeated(Hero, Monster), score(Monster, Points), Score is Points. monster(bat). monster(skeleton). monster(boss). score(bat, 100). score(skeleton, 100). score(boss,

假设我有一个游戏,里面有一个英雄和几个怪物。如果你击败了每只怪物,它们会得到一定的分数

total_score(Hero, Score):-
    defeated(Hero, Monster),
    score(Monster, Points),
    Score is Points.

monster(bat).
monster(skeleton).
monster(boss).

score(bat, 100).
score(skeleton, 100).
score(boss, 1000).

defeated(bob, bat).
defeated(bob, skeleton).
defeated(bob, boss).
如果我做了未来的请求:

?- total_score(bob, Y).
我希望答案是:

Y : 1200.
但我得到的是:

Y : 100,
Y : 100,
Y : 1000.

我应该对总分做什么更改才能使其生效?我明白为什么我会有这个结果,但我真的不知道该怎么做才能得到事实的总结。

好吧,我设法找到了解决方案,问题是我知道我可以使用findall和sum_list,但我不知道如何将不同的关系连接在一起。经过一些研究,我终于找到了解决办法。。。所以我做了:

total_score(Hero, Score):-
    findall(Points, (defeated(Hero, Monster), score(Monster, Points)), ListOfPoints),
    sum_list(ListOfPoints, Score).

汇总目标给出的所有答案的标准方法是使用
findall/3
。我们可以通过修改
总分/2
来实现您想要的目标,因此:

total_score(Hero, Score):-
    findall(Points,
            ( defeated(Hero, Monster),
              score(Monster, Points)),
            Points),
    sum_list(Points, Score).
因此,本文勾勒出谓词的用法:
findall(+Template,:Goal,-Bag)
。也就是说,我们找到所有实例化
模板的解决方案,给定
目标
,这些值收集在
中。正如您从我提供的示例中看到的,目标可以是复合词(即合取或析取)

但是,SWI Prolog还提供了(默认值,即不需要显式导入),我们避免调用
sum_list/2
,因此:

total_score(Hero, Score):-
    aggregate_all( sum(Points),
                   ( defeated(Hero, Monster),
                     score(Monster, Points)),
                   Score).

@lowerer的可能重复这确实是一个近乎重复的问题,但这个问题的质量更好,答案也很模糊(基本上只是指向文档),因此我认为适当的回答时机已经成熟:)