Pergunta

Estou tentando combinar um subconjunto dos fatos que estou criando, e meu teste estava funcionando muito bem!

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.

Então eu adicionei um fato para representar meu próximo caso em potencial e agora está bastante quebrado. Sou novo no Prolog, não sei por que isso é ou como corrigi -lo.

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.

Sugestões são bem -vindas.

Foi útil?

Solução 3

OK, mudando para um tipo de dados finito ajudou!

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

Outras dicas

X pode ser apenas um número natural? Se sim, então você pode mudar sua regra

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

para

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

Isso funciona pelo menos no 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 ;
...

Dentro fuzzy/2 e remaining/4, você está ligando x/2 com um desinsntiado Z. Isso significa que o lado esquerdo do + (e portanto >) é desinstaliado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top