2014-03-28 100 views
1

我有谓词如下快速PROLOG查询

dur(a,1). 
dur(b,2). 
dur(c,3). 
dur(d,4). 

说我要加入列表的元素[A,B,C]所以总和= 6 如何访问与关联的值变量?

因为这样的事情

len([],0). 
len([H|T], Sum) :- 
    len(T, Rest), 
    Sum is H + Rest. 

不起作用,它工作正常[1,2,3],但不是为[A,B,C]这是有道理的,但我不没有线索如何使它为列表len([a,b,c],Sum)工作。

+0

如果你有原子'了',你可以得到它的价值通过查询'dur(a,Value)'。如果你有一个变量X,你可以通过查询'dur(X,Value)'来得到任何'X'的值。你可以在你的'len'谓词中使用它来对这些值进行求和,而不是尝试对原子本身求和。 – lurker

回答

1

如何访问与变量相关的值?

深的循环,在实际计算发生

len([],0). 
len([H|T], Sum) :- 
    dur(H, V), % 'hardcoded' join 
    Sum is V + Rest. 
    len(T, Rest), 

必须“加入”现在真正的问题是显而易见的。

由于一个连接在Prolog中是这样一个基本操作 - 实际上,它几乎没有什么特别之处 - 它难以编写 - 因此重复使用 - 真正独立于数据命名的算法。

通常“二阶”编程可以帮助按摩数据以适应更通用的上下文。像

len(Keys, Len) :- maplist(dur, Keys, Nums), sum_list(Nums, Len). 

SWI-Prolog的自动加载MAPLIST/3来自库(apply),其他一些Prolog的可能要求你明确加载...

+0

@mbratch:谢谢! – CapelliC