2013-06-23 2 views
3

Прошлое довольно давно, так как я имею дело с проблемой маркировки в прологе Sicstus. Я хочу создать массив длиной 7, где каждый элемент снова представляет собой массив из 4 целых чисел. Я пробовал следующий код, но он не работает и дает ошибку создания.Sicstus prolog: маркировка списка в списке

:- use_module(library(clpfd)). 

schedule(Ss) :-  
    length(Ss, 7), 
    Ss = [[A, B, C, D]|T], 
    solve_days(Ss), 
    labeling([], Ss). 

solve_days([]). 
solve_days([[A, B, C, D]|T]):- 
    A in 1..3, 
    B in 4..7, 
    C in 7..9, 
    D in 6..10, 
    solve_days(T).   

Может ли кто-нибудь дать мне совет, как его решить? Большое спасибо!

+0

От http://sicstus.sics.se/sicstus/docs/latest4/html/sicstus.html/Membership- Constraints.html # Membership-Constraints домен/3 предназначен для списка переменных. Для одиночных переменных следует использовать «in». Не забудьте также установить T-домен. – hakank

+0

Спасибо, hakank. Я внес некоторые изменения. Sicstus prolog говорит, что ошибка типа в аргументе 2 пользователя: labeling/2 ! ожидал целое число, но нашел [_128, _130, _132, _134] ! target: labeling (user: [], [[_ 128, _130, _132, _134], [_ 13 –

+0

Переименован tite из «array» в «list» по причинам. –

ответ

2

Аргумент для маркировки должен быть простым. Один из способов исправить это - использовать append/3 для выравнивания A..D и T, например. append([A,B,C,D],T,Vars).

1

Подход, часто рассматриваемый для решения такого рода досады, заключается в использовании предиката term_variables/2 перед вызовом маркировки.

Предшественник term_variables/2 является основным предикатом ISO с Corr.2 и определяет список переменных в терминах.

В данном случае можно было бы заменить

labeling([], Ss) 

по

term_variables(Ss, Vars), labeling([], Vars)