샘플 프로그램은 열 여덟 개의 퀸 솔루션 수를 열거하고 계산합니다.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
코드를 읽을 수있는 형식으로 만들 수 있습니까? – false
링크에 원래 하나가 있습니다 –
다음 번에는 읽을 수있는 버전을 여기에 포함하십시오. 그것이 SO가 작동하는 방식입니다. – false