Prolog常数

时间:2010-06-28 14:47:25

标签: prolog

有没有办法在prolog中定义常量?

我想写点像

list1 :- [1, 2, 3].
list2 :- [4, 5, 6].

predicate(L) :- append(list1, list2, L).

我现在正在使用的解决方法是

list1([1, 2, 3]).
list2([4, 5, 6]).

predicate(L) :-
    list1(L1),
    list2(L2),
    append(L1, L2, L).

但每次我需要访问常量时绑定一个“无用”变量有点笨拙。

我认为另一个(甚至是更丑陋的)工作将是在构建链中包含cpp。

(在我的实际应用中,列表是很多地方使用的大型LUT。)

2 个答案:

答案 0 :(得分:11)

我不认为你可以在'纯'Prolog中做到这一点(虽然有些实现可能会让你做一些接近的事情,例如ECLiPSe有架子)。

原因是:

1)你不能写之类的东西

list1 :- [4, 5, 6].

list1 = [4, 5, 6].

因为右手边和左手边都是不匹配的地面术语。

2)你不能写之类的东西

List1 :- [4, 5, 6].

List1 = [4, 5, 6].

因为左侧现在是变量,但变量只允许在谓词头部/主体中使用。

可以做的是定义多选项谓词,如:

myList([1, 2, 3]).
myList([4, 5, 6]).

然后使用bagof(或类似的谓词)检索其所有值:

predicate(L) :-
    bagof(ML, myList(ML), MLs),        
    concat(MLs, L).

MLs是满足ML的所有myList(ML)值的列表,当然concat连接列表列表。

答案 1 :(得分:2)

不,你不能在Prolog中做到这一点,并通过谓词定义它是明智之举。

或者更好的是,将查找函数封装在谓词中。

那就是说,如果你真的想要使用预处理,那就是term_expansion/2,但是如果你不小心的话,它会使你的代码变得不可读和混乱。

您还可以查看包含函数表示法的Prolog扩展(像Mercury这样的函数逻辑语言)。但这些比Prolog更具异国情调。