Предикат Пролог с переменным числом аргументов

Я пишу Судоку-Солвер с PROLOG. Я хочу, чтобы решатель работал со всеми возможными размерами Судоку, поэтому, естественно, мне нужно создавать предикаты, которые принимают переменное число аргументов. (Например, чтобы построить "блоки" в судоку.)

Как я могу построить или смоделировать предикаты с переменным количеством аргументов?

1 ответ

Решение

SWI-Prolog - как и любая другая система - предлагает неограниченную арность, тогда вы можете работать с "массивами", если хотите. Просто назовите предикат, как вы бы сделали с вектором. Пример распределителя:

22 ?- functor(A,a,10).
A = a(_G366, _G367, _G368, _G369, _G370, _G371, _G372, _G373, _G374, _G375).

Чаще вы размещаете и модифицируете:

30 ?- functor(A,a,4),arg(2,A,ciao).
A = a(_G4841, ciao, _G4843, _G4844).

Конечно, поскольку многие идиомы Пролога основаны на списках, вы отвечаете за любой алгоритм, но учтите, что недетерминизм (a la member/2) доступен с помощью arg/ 3. Что я имею в виду, он может искать индекс аргумента:

31 ?- arg(A,a(1,2,ciao,4),ciao).
A = 3 ;
false.

редактировать, так как вы собираетесь использовать библиотеку (clpfd), лучшим конструктором может быть =../ 2

?- length(L, 9), L ins 1..9, A =.. [a | L].
L = [_G3778, _G3781, _G3784, _G3787, _G3790, _G3793, _G3796, _G3799, _G3802],
A = a(_G3778, _G3781, _G3784, _G3787, _G3790, _G3793, _G3796, _G3799, _G3802),
_G3778 in 1..9,
_G3781 in 1..9,
_G3784 in 1..9,
_G3787 in 1..9,
_G3790 in 1..9,
_G3793 in 1..9,
_G3796 in 1..9,
_G3799 in 1..9,
_G3802 in 1..9.
Другие вопросы по тегам