评估(解释)Prolog中的列表

时间:2014-11-17 18:08:03

标签: prolog

如果我在Prolog中有一个由运算符和操作数组成的列表,那么如何解释列表以在适当的操作数上获得适当的运算符?

所以我们假设我们有一个

列表
  

[100,25,sum,2,multiply,800,50,subtract,sum]

应通过以下步骤生成[1000]

// 100 and 25 are summed together, making it
[125, 2, multiply, 800, 50, subtract, sum]
// 125 and 2 are multiplied, making it 250
[250, 800, 50, subtract, sum]
// 50 is subtracted from 800, making it 750
[250, 750, sum]
// 250 is added to 750, making it 1000
[1000]

我试图理解如何使这种情况发生的结构(特别是如何遍历列表并进行适当的操作,而不是那些关于执行实际工作的辅助谓词[sum,multiple等] )。哪种情况最好,我应该考虑哪些其他因素?

情景1'一路走来' (主谓词,其中包含list1(评估前)和list2(最终列表)):

  1. 在list1
  2. 中查找非整数的第一个实例
  3. 检查是否有'字'在字典或列表中(可能使用member),如果是,请查看列表中是否有足够的先前值来完成它,如果是,则返回带尾部的已完成操作,如果没有,则返回假的。
  4. 继续,直到找不到更多的字词
  5. 情景2'展望未来' (主谓词,其中包含list1(评估前)和list2(最终列表)):

    1. 查看列表中的每个元素,跟踪最长运算符所需的最大数量(假设和duplicatePairs所需的操作需要两组对,因此需要4个数字)
    2. 如果我遇到一个操作员,执行操作,并返回未使用的头部(如果有的话),并附上完整的结果和尾部。
    3. 继续,直到找不到更多的字词
    4. 场景3'向左折叠' (主谓词,其中包含list1(评估前)和list2(最终列表)):

      • 使用一些map函数(maplist / 3可能),以某种方式递归地通过list1向左折叠,直到达到最终列表(从函数式编程[Haskell]借用这个想法)

1 个答案:

答案 0 :(得分:2)

我能想到的更简单的代码:

eval([A1,A2,sum|Rest], Result) :- Sum is A1+A2, !, eval([Sum|Rest], Result).
eval(Result, Result).

依旧......测试:

?- eval([1,2,sum,4,sum],R).
R = [7].

当然,'catchall'eval(Result, Result).必须是最后一条规则......