2010-01-11 18 views
5

Sto provando ad abbinare un sottoinsieme dei fatti che sto creando e il mio testcase funzionava alla grande!Gli argomenti Prolog non sono sufficientemente istanziati

 
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. 

Poi ho aggiunto un fatto per rappresentare il mio prossimo potenziale caso, e ora è abbastanza rotto. Sono nuovo di Prolog, non sono sicuro del motivo per cui questo è o come risolverlo.

 
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. 

suggerimenti benvenuto.

risposta

1

Ok, cambiando a un tipo di dati finita aiutato!

 

% 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. 
2

In fuzzy/2 e remaining/4, si chiedono x/2 con una istanziato Z. Ciò significa che il lato sinistro di + (e quindi >) non è chiaro.

+0

Purtroppo penso che questo possa invalidare questo metodo di ricerca dei miei fatti. Suggeriresti qualche soluzione alternativa o dovrò rivalutare il mio modello? – Demosthenex

3

X può essere solo un numero naturale? Se sì, allora si può cambiare la regola

x([6,X,8,9], 'woot') :- (X+0) > 7. 

a

x([6, X, 8, 9], 'woot') :- between(8, inf, X). 

Questo funziona almeno 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 ; 
... 
+0

Alla fine sarà una prova contro una serie di fatti che ho elencato (cioè: meno (a, b), meno (b, c) -> meno (a, c)). Stavo usando i numeri come segnaposto mentre ho testato il concetto. Ci proverò con un altro tipo di dati perché la mia enumerazione dovrebbe limitare l'elenco delle scelte. – Demosthenex

Problemi correlati