有没有办法在prolog中定义常量?
我想写点类似的东西
list1 :- [1, 2, 3].
list2 :- [4, 5, 6].
predicate(L) :- append(list1, list2, L).
Run Code Online (Sandbox Code Playgroud)
我现在正在使用的解决方法是
list1([1, 2, 3]).
list2([4, 5, 6]).
predicate(L) :-
list1(L1),
list2(L2),
append(L1, L2, L).
Run Code Online (Sandbox Code Playgroud)
但是每次我需要访问常量时绑定一个像这样的"无用"变量有点笨拙.
我认为另一个(甚至是更丑陋的)工作将是在构建链中包含cpp.
(在我的实际应用中,列表是在许多地方使用的大型LUT.)
Mau*_*Mau 11
我不认为你可以在'纯'Prolog中做到这一点(虽然有些实现可能会让你做一些接近的事情,例如ECLiPSe有架子).
原因是:
1)你不能写像
list1 :- [4, 5, 6].
Run Code Online (Sandbox Code Playgroud)
要么
list1 = [4, 5, 6].
Run Code Online (Sandbox Code Playgroud)
因为右手侧和左手侧都是不匹配的接地术语.
2)你不能写像这样的东西
List1 :- [4, 5, 6].
Run Code Online (Sandbox Code Playgroud)
要么
List1 = [4, 5, 6].
Run Code Online (Sandbox Code Playgroud)
因为左侧现在是变量,但变量只允许在谓词头/体中.
你可以做的是定义一个多选项谓词,如:
myList([1, 2, 3]).
myList([4, 5, 6]).
Run Code Online (Sandbox Code Playgroud)
然后使用bagof(或类似的谓词)检索其所有值:
predicate(L) :-
bagof(ML, myList(ML), MLs),
concat(MLs, L).
Run Code Online (Sandbox Code Playgroud)
MLs
是ML
满足myList(ML)
并且当然concat
连接列表列表的所有值的列表.