2015-01-22 6 views
2

MiniZinc의 기본에 익숙해졌습니다. 그래서, MiniZinc IDE로 무장, 지금 디버깅 minizinc (어쨌든, 버그를 발견 했습니까?)

Compiling hello.mzn 
Running hello.mzn 
hello world [1, 2, 3] 
---------- 
Finished in 49msec 

를 표시

solve satisfy; 

string: s1 = "hello"; 
string: s2 = "world"; 

function list of int: cdr(list of int: v) = 
    [v[i] | i in 1..length(v)]; 
function list of string: cdr(list of string: v) = 
    [v[i] | i in 1..length(v)]; 

function string: concat(list of string: V) = 
    if length(V) == 0 then "" else V[0] ++ concat(cdr(V)) endif; 

output [concat([s1," ",s2])++" "++show(cdr([1,2,3]))]; 

같은 조각을 쓰기 INT의 목록의 지휘관이 잘못된 것 같습니다. 나는 그것을 발견 할 수는 없지만 그것이 내 버그라고 생각한다.

assertions 여기에서 나를 도와 줄 수 있습니까? Gecode를 사용하여 실제로 코드를 생산에 적용 할 예정이므로 그 경로를 따라갈 수 있습니까?

감사 어떤 힌트 ...

편집이 조각

solve satisfy; 

function list of string: cdr_s(list of string: v) = 
    [v[i] | i in 2..length(v)]; 

function string: vcat(list of string: V) = 
    if length(V) == 0 then "" else V[1] ++ vcat(cdr_s(V)) endif; 

output [vcat(["hello"," ","world"])]; 

보고서

MiniZinc: type error: no function or predicate with this signature found: `cdr_s(array[int] of string)' 
/tmp/MiniZinc IDE-9nYiuF/hello.ozn:2 

답변

3

나는 버그라고 생각하는 것에 약간 혼란스럽고 다른 문제가 있습니다.

"[1,2,3]"를주는 "cdr ([1,2,3])"로 모델의 출력이 잘된 것 같습니다. 이름은 "지휘관은"당신이 "하지만 처음"기능을 할 것을 제안하지만, MiniZinc은 기본 1 기반 시스템 (0 기반이 아닌) 그래서 하나가 인덱스를 정의 할 수 있기 때문에 함수가 아마

function list of int: cdr(list of int: v) = 
    [v[i] | i in 2..length(v)]; 

을해야한다 배열 (예 :그 시작 인덱스 0),보다 일반적인 정의는 나는 매우 행복하지 않다하는이 (입니다하지만 당신은 아마) 내 포인트를 얻을 : 그래서 지금

function list of int: cdr3(list of int: v) = 
    [v[i] | i in index_set(v) diff {min(index_set(v))}]; 

을이 같은 작성할 수 있습니다

% ... 
array[int] of int: t = array1d(0..3, [1,2,3,4]) 
output [ 
    show(cdr3(t)) 
]; 

또한 "concat"함수는 내장 된 "concat"대신에 전혀 사용되지 않습니다. (당신의 버전을 "concat1"으로 이름을 변경하십시오.) 그래서 "V [0]"구문 (범위를 벗어난 오류를 제공해야합니다)에 대한 오류가 발생하지 않습니다. 내장 기능을 다시 정의하려고하면 오류가 발생하지만 MiniZinc 2.0은 특정 영역에서 버전 1.6보다 더 관대합니다.

그리고 Axel의 일반적인 의견에 동의합니다. 일반적인 프로그래밍 언어 인 MiniZinc은별로 인상적이지 않습니다 (적어도 제 책에서는). 모델에 제약 조건과 의사 결정 변수를 추가 할 때 진정한 힘이 생깁니다. 결정 변수를 사용한 MiniZinc의 목록/배열 처리는 Prolog만큼 동적이지 않습니다. 일반적으로 배열의 용어는 항상 고정 길이라고 생각해야합니다.

MiniZinc를 살펴 보는 것이 좋습니다. MiniZinc를 배울 때이 주석이 실제로 도움이되기를 바랍니다.

/하칸

+0

- 화제가 아닙니다 - 현재 MiniZinc 페이지에 연결할 수 없습니까? –

+0

나는 그것을 언급했을 것이다. 예, http://hakank.org/가 일주일 만에 다운되었습니다. 가장 좋은 대안은 내 GitHub 페이지를 사용하는 것입니다. https://github.com/hakank/hakank 거의 모든 내 CP 모델 (및 기타 모든 것)이 게시됩니다. – hakank

+0

귀하의 표시로 수정 한 후에 발견 된 또 다른 버그 : 사용자 기능이 다른 사용자 기능을 호출 할 수없는 것으로 보입니다 ... – CapelliC

2

MiniZinc는 제약 해결사보다는 일반 프로그래밍 언어입니다. 그것은 변수와 매개 변수를 알고 있습니다. 솔루션을 구성하는 변수 값에 대한 검색 공간을 한정하기 위해 제약 조건을 정의합니다. 그런 다음 output 문을 사용하여 솔루션을 형식화 된 방식으로 표시합니다.

코드에 변수 정의 나 제약 조건이 없습니다. 유효하지 않은 매개 변수를 검색하기 위해 특수 제약 ("제약 조건 주장")으로 어설 션을 MiniZinc에서 사용하고 있습니다. 이는 C/C++assert 매크로와 유사합니다.

사용자 정의 함수가 MiniZinc 2.0에 추가되어 더 복잡한 방식으로 제약 조건을 작성했습니다. 재귀도 지원됩니다.

tutorialexamples을 살펴보십시오.

하칸 켈러 스트랜드의 MiniZinc page도 훌륭한 시작입니다.

gecode 태그는 MiniZinc에 대해 지원되는 해결사 백엔드 중 하나를 참조합니다. MiniZinc IDE은 백엔드를 선택할 수 있습니다. 일부 백엔드에는 외부 패키지 설치가 필요합니다. MiniZinc 컴파일러는 FlatZinc 중간 코드를 생성합니다.이 코드는 최종 해석되고 해석기 백 엔드 중 하나에 의해 해결됩니다.

+0

감사합니다. 어리석은 테스트를 통해 사용자 함수 오버로드가 지원되는 범위와 디버깅 도구를 사용할 수 있는지 이해하려고했습니다. 지금까지 디버깅 할 실제 방법을 찾지 못했습니다 ... – CapelliC

+0

경우에 따라 FlatZinc 파일을 살펴 보는 것이 도움이됩니다. MiniZinc이 제약 프로그래밍 사양을 해석하는 방법을 보여줍니다. 그 외에도 --keep-files 매개 변수를 사용하여 minizinc.exe를 시작하여 중간 파일을 분석 할 수 있습니다. MiniZinc 주변의 대부분의 실행 파일에는 선택적 명령 줄 매개 변수로 디버깅 플래그가 있습니다. –

+0

@CapelliC 디버깅하는 한 가지 방법은 인덱스 등을 인쇄 할 때 trace/1을 사용하는 것입니다. – hakank