2017-11-10 2 views
7

샘플 프로그램은 열 여덟 개의 퀸 솔루션 수를 열거하고 계산합니다.swi-prolog 및 yap의 결과가 서로 다릅니다.

[user]. 
(perm([X|Y],Z) :- (perm(Y,W),takeout(X,Z,W))). 
perm([],[]). 
takeout(X,[X|R],R). 
(takeout(X,[F|R],[F|S]) :- (takeout(X,R,S))). 
(solve(P) :- (perm([1,2,3,4,5,6,7,8],P),combine([1,2,3,4,5,6,7,8],P,S,D),alldiff(S),alldiff(D))). 
(combine([X1|X],[Y1|Y],[S1|S],[D1|D]) :- (is(S1,+(X1,Y1)),is(D1,-(X1,Y1)),combine(X,Y,S,D))). 
combine([],[],[],[]). 
(alldiff([X|Y]) :- (\+ member(X,Y),alldiff(Y))). 
alldiff([X]). 
end_of_file. 

질의 :

(setof(P,solve(P),Set),length(Set,L),write(L),write('\n'),fail). 

swipl

규칙 (. 코드를 판독하기 어려운 미안이면이 기계 생성 된 S-식에서 원문 코드 https://www.cpp.edu/~jrfisher/www/prolog_tutorial/2_11.html이다) 92를 반환합니다. 반면에 yap은 40320을 반환합니다. 또한 solve(P)을 쿼리하면 swipl은 두 개의 솔루션 만 반환합니다 (92와 모순 됨). 야프는 더 많은 것을 반환합니다 (아마도 그 중 40320 개). 왜 그런 차이가 있습니까? 그런 심각한 호환성 문제가 있습니까?

버전 :

  • YAP 6.2.2 (x86_64에 리눅스) 토 구월 17 세계 협정시 13시 59분 3초 2,016
  • SWI-프롤로그 AMD64 용 버전 7.2.3
+0

코드를 읽을 수있는 형식으로 만들 수 있습니까? – false

+0

링크에 원래 하나가 있습니다 –

+1

다음 번에는 읽을 수있는 버전을 여기에 포함하십시오. 그것이 SO가 작동하는 방식입니다. – false

답변

7

이전 버전의 YAP에서는 정의되지 않은 술어에 대한 쿼리가 단순히 실패했습니다. 위의 경우 YAP에 정의되지 않은 member/2입니다. 그리고 이런 이유로 당신의 시험 alldif/1는 항상 성공합니다 - 따라서 많은 숫자를 얻습니다.

이 동작은 기본값이 error 인 Prolog 플래그 unknown에 의해 제어됩니다. YAP 6.2에서 기본값은 (잘못) fail입니다. 이것은 6.3에서 수정되었습니다.

:- set_prolog_flag(unknown, error). 

정의되지 않은 조건부에 대해 오류가 발생합니다. 그런 다음 member/2을 정의해야합니다.

+2

감사합니다. 그래서'member'는 내장 기능이 아닙니다 ... 그러나 "프롤로그"(호환성 레이어, 일종의)는 좋게 들립니다. 프로세스가 시작될 때마다 lisp-to-prolog 라이브러리를로드 할 수 있습니다. –

+0

흠, 그건 그렇고, 단지 6.3.10 복제 된'.configure '이후로'make : ***는 타겟을 만들기위한 규칙이 없다.'Hap/dglobals.h ','yap '. 멈춰라. "... –

+0

왜 표준화가 다른 CSP 커뮤니티에 비해 그렇게 나쁠 지 궁금하다. Minizinc는 CSP의 일반적인 형식으로 매년 경쟁을하고 있습니다. SAT에는 DIMACS가 있고 SMT에는 DIMACS가 있습니다. –

관련 문제