Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Prolog Constants

Tags:

prolog

Is there any way to define constants in prolog?

I'd like to write something like

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

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

The work-around I'm using now is

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

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

but it's a bit clumsy to bind a "useless" variable like this every time I need to access the constant.

Another (even uglier) work around I suppose, would be to include cpp in the build-chain.

(In my actual application, the list is a large LUT used in many places.)

like image 672
aioobe Avatar asked Jun 28 '10 14:06

aioobe


1 Answers

I don't think you can do that in 'pure' Prolog (though some implementations may let you do something close, for example ECLiPSe has shelves).

The reason is:

1) You can't write things like

list1 :- [4, 5, 6].

or

list1 = [4, 5, 6].

Because right hand side and left hand side are both grounds terms which don't match.

2) You can't write things like

List1 :- [4, 5, 6].

or

List1 = [4, 5, 6].

because the left hand side is now a variable, but variables are only allowed in predicate heads/bodies.

What you could do is to define a multi-option predicate like:

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

and then retrieve all its values with bagof (or similar predicates):

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

MLs is the list of all ML values that satisfy myList(ML) and of course concat concatenates a list of lists.

like image 100
Mau Avatar answered Dec 12 '22 10:12

Mau