2010-01-11 20 views
5

Tôi đang cố gắng kết hợp một tập hợp con các sự kiện tôi đang tạo và testcase của tôi hoạt động rất tốt!Đối số Prolog không được trình bày đầy đủ

 
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. 

Sau đó, tôi đã thêm thực tế đại diện cho trường hợp tiềm năng tiếp theo của tôi và giờ đây nó đã bị hỏng. Tôi mới làm quen với Prolog, tôi không chắc tại sao đây là cách khắc phục.

 
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. 

Đề xuất được hoan nghênh.

Trả lời

1

Ok, chuyển sang một kiểu dữ liệu hữu hạn giúp!

 

% 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

Trong fuzzy/2remaining/4, bạn đang gọi x/2 với số Z chưa được giải quyết. Điều này có nghĩa là Mặt Trái của + (và do đó >) không được gỡ bỏ.

+0

Rất tiếc, tôi cho rằng điều này có thể làm mất hiệu lực phương pháp tìm kiếm sự thật của tôi. Bạn có đề xuất bất kỳ giải pháp nào không, hoặc tôi có phải đánh giá lại mô hình của mình không? – Demosthenex

3

Chỉ X có thể là số tự nhiên không? Nếu có, thì bạn có thể thay đổi quy tắc của bạn

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

để

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

này hoạt động ít nhất là trong 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

Cuối cùng nó sẽ là một thử nghiệm đối với một loạt các sự kiện tôi đã liệt kê (ví dụ: ít hơn (a, b), ít hơn (b, c) -> ít hơn (a, c)). Tôi đã sử dụng số như trình giữ chỗ trong khi thử nghiệm khái niệm này. Tôi sẽ thử nó với một kiểu dữ liệu khác vì điều tra của tôi nên giới hạn danh sách các lựa chọn. – Demosthenex

Các vấn đề liên quan