Prolog Argumente nicht ausreichend instanziiert
-
20-09-2019 - |
Frage
Ich versuche, eine Teilmenge der Tatsachen entsprechen Ich schaffe, und mein Testfall funktionierte großartig!
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.
Dann hat ich eine Tatsache, meinen nächsten potentiellen Fall darzustellen, und jetzt ist es ganz gebrochen. Ich bin neu in Prolog, ich bin nicht sicher, warum das so ist und wie es zu beheben.
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.
Vorschläge willkommen.
Lösung 3
Ok, Wechsel zu einem endlichen Datentyp geholfen!
% 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.
Andere Tipps
Can X nur eine natürliche Zahl sein? Wenn ja, dann können Sie Ihre Regel ändern
x([6,X,8,9], 'woot') :- (X+0) > 7.
x([6, X, 8, 9], 'woot') :- between(8, inf, X).
Das funktioniert zumindest in SWI-Prolog:
?- x(A, B).
A = [6, 8, 8, 9],
B = woot ;
A = [6, 9, 8, 9],
B = woot ;
A = [6, 10, 8, 9],
B = woot ;
...
In fuzzy/2
und remaining/4
, die Sie anrufen x/2
mit einem instanziierten Z
. Dies bedeutet, dass die linke Seite von +
(und damit >
) ist instanziierte.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow