프롤로그 주장은 충분히 인스턴스화되지 않습니다
-
20-09-2019 - |
문제
나는 내가 만든 사실의 하위 집합을 일치 시키려고 노력하고 있으며 테스트 케이스가 잘 작동했습니다!
x([1,2,3,4],'bleah'). x([1,2,4],'bleah2'). x([1,2],'bleah8'). x([1,3,4],'bleah3'). x([5,6,7,8],'bleah5'). x([6,7,8,9],'bleah6'). fuzzy(X,R) :- x(Z, R), subset(X,Z) . remaining(X,Y,D,M) :- x(Z,D) , select(X,Z,N), select(Y,N,M). pair(X,Y,R) :- x([X,Y],R) ; x([Y,X],R). Output: ?- x([1,2|REST],D). REST = [3, 4], D = bleah ; REST = [4], D = bleah2 ; REST = [], D = bleah8 ; false. ?- pair(2,1,D). D = bleah8 ; false. ?- fuzzy([2,1],R). R = bleah ; R = bleah2 ; R = bleah8 ; false. ?- remaining(2,1,D,M). D = bleah, M = [3, 4] ; D = bleah2, M = [4] ; D = bleah8, M = [] ; false.
그런 다음 다음 잠재적 인 사례를 대표 할 사실을 추가했으며 이제는 상당히 깨졌습니다. 저는 Prolog를 처음 사용합니다. 왜 이것이 왜 또는 어떻게 고치는 지 잘 모르겠습니다.
x([6,X,8,9],'woot') :- (X+0) > 7. Output: ?- x([1,2|REST],D). REST = [3, 4], D = bleah ; REST = [4], D = bleah2 ; REST = [], D = bleah8 ; false. ?- pair(2,1,D). D = bleah8 ; false. ?- fuzzy([2,1],R). R = bleah ; R = bleah2 ; R = bleah8 ; ERROR: >/2: Arguments are not sufficiently instantiated ^ Exception: (9) _G260+0>7 ? abort % Execution Aborted ?- remaining(2,1,D,M). D = bleah, M = [3, 4] ; D = bleah2, M = [4] ; D = bleah8, M = [] ; ERROR: >/2: Arguments are not sufficiently instantiated ^ Exception: (10) _G270+0>7 ? abort % Execution Aborted ?- x([_,15,_,_],D). D = woot.
제안을 환영합니다.
해결책 3
좋아, 유한 데이터 유형으로 바꾸는 것이 도움이되었습니다!
% Basic comparisons same(X,Y) :- X == Y. greaterThan(X,Y) :- lessThan(Y,X). lessThan(X,Y) :- is_lessThan(X,Y). lessThan(X,Y) :- is_lessThan(X,Z) , lessThan(Z,Y). % Enumerate a list is_lessThan( 'a', 'b' ). is_lessThan( 'b', 'c' ). is_lessThan( 'c', 'd' ). is_lessThan( 'd', 'e' ). is_lessThan( 'e', 'f' ). is_lessThan( 'f', 'g' ). is_lessThan( 'g', 'h' ). is_lessThan( 'h', 'i' ). % "Static" facts of variable length x(['a','b','c','d'],'abcd'). x(['a','b','d'],'abd'). x(['a','b'],'ab'). x(['a','c','d'],'acd'). x(['e','f','g','h'],'efgh'). x(['f','g','h','i'],'fghi'). % "Dynamic" facts of variable length and constraint x(['f',X,'h','i'],'fXhi') :- greaterThan('g',X). x(['f',X,Y],'fXY') :- greaterThan('g',X), lessThan(Y,'i'). % specify the two list items separately in X & Y fuzzyMatch(X,Y,R) :- x([X,Y],R) ; x([Y,X],R) . % specify the list X fuzzyMatch(X,R) :- x(Z, R), subset(X,Z) . % specify two list items separately, returning the remaining terms that didn't match fuzzyMatch(X,Y,D,M) :- x(Z,D) , select(X,Z,N), select(Y,N,M). Output: ?- fuzzyMatch('b','a',D). D = ab ; false. ?- fuzzyMatch(['b','a'],D). D = abcd ; D = abd ; D = ab ; D = fXY ; D = fXY ; false. ?- fuzzyMatch('b','a',R,D). R = abcd, D = [c, d] ; R = abd, D = [d] ; R = ab, D = [] ; R = fXY, D = [f] ; R = fXY, D = [f] ; false.
다른 팁
X는 자연적인 숫자 일 수 있습니까? 그렇다면 규칙을 변경할 수 있습니다
x([6,X,8,9], 'woot') :- (X+0) > 7.
에게
x([6, X, 8, 9], 'woot') :- between(8, inf, X).
이것은 적어도 swi-proleg에서 작동합니다.
?- x(A, B).
A = [6, 8, 8, 9],
B = woot ;
A = [6, 9, 8, 9],
B = woot ;
A = [6, 10, 8, 9],
B = woot ;
...
~ 안에 fuzzy/2
그리고 remaining/4
, 당신은 전화하고 있습니다 x/2
일정하지 않은 Z
. 이것은 왼쪽을 의미합니다 +
(따라서 >
)는 일정하지 않습니다.
제휴하지 않습니다 StackOverflow