Prolog常数

aio*_*obe 10 prolog

有没有办法在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)

MLsML满足myList(ML)并且当然concat连接列表列表的所有值的列表.