有没有办法在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。)
答案 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更具异国情调。