5

作成しているファクトのサブセットを一致させようとしていますが、テストケースはうまく機能していました!

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), サブセット(X,Z) .
残り(X、Y、D、M):- x(Z、D)、選択(X、Z、N)、選択(Y、N、M)。
ペア (X、Y、R) :- x([X、Y]、R) ; x([Y,X],R)。

出力:
?- x([1,2|REST],D)。
レスト = [3, 4],
D =ブリー。
レスト = [4]、
D = ブレア 2 ;
残り = []、
D = bleah8 ;
間違い。

?- ペア(2,1,D)。
D = bleah8 ;
間違い。

?- fuzzy([2,1],R)。
R =ブリー。
R = bleah2 ;
R = bleah8 ;
間違い。

?- 残り (2,1,D,M)。
D =ブリー、
M = [3, 4] ;
D =ブリー2、
M = [4] ;
D =ブリー8、
M = [] ;
間違い。

次に、次の潜在的なケースを表すファクトを追加しましたが、今ではかなり壊れています。私は Prolog を初めて使用します。これがなぜなのか、どのように修正すればよいのかわかりません。

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

出力:
?- x([1,2|REST],D)。
レスト = [3, 4],
D =ブリー。
レスト = [4]、
D = ブレア 2 ;
残り = []、
D = bleah8 ;
間違い。

?- ペア(2,1,D)。
D = bleah8 ;
間違い。

?- fuzzy([2,1],R)。
R =ブリー。
R = bleah2 ;
R = bleah8 ;
エラー: >/2: 引数が十分にインスタンス化されていません
^ 例外: (9) _G260+0>7 ? アボート
% 実行が中止されました

?- 残り (2,1,D,M)。
D =ブリー、
M = [3, 4] ;
D =ブリー2、
M = [4] ;
D =ブリー8、
M = [] ;
エラー: >/2: 引数が十分にインスタンス化されていません
^ 例外: (10) _G270+0>7 ? アボート
% 実行が中止されました

?- x([_,15,_,_],D)。
D = ウート。

提案を歓迎します。

4

3 に答える 3

3

X は自然数だけですか? はいの場合、ルールを変更できます

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

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

これは、少なくとも 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 ;
...
于 2010-01-11T22:14:13.587 に答える
2

fuzzy/2とでは、インスタンス化されていremaining/4ない を呼び出しx/2ていますZ。これは、+(したがって>) の左側がインスタンス化されていないことを意味します。

于 2010-01-11T20:33:54.367 に答える
1

わかりました、有限データ型に変更すると役に立ちました!

% 基本的な比較
同じ(X,Y) :- X == Y.
より大きい(X,Y) :- より小さい(Y,X)。

lessThan(X,Y) :- is_lessThan(X,Y)。
lessThan(X,Y) :- is_lessThan(X,Z) , lessThan(Z,Y).

% リストを列挙する
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' )。

% 可変長の「静的」ファクト
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')。

% 可変長と制約の「動的」ファクト
x(['f',X,'h','i'],'fXhi') :- より大きい ('g',X).
x(['f',X,Y],'fXY') :- より大きい('g',X), より小さい(Y,'i')。

% X & Y で 2 つのリスト項目を別々に指定します
fuzzyMatch(X,Y,R) :- x([X,Y],R) ; x([Y,X],R) .

% リスト X を指定
fuzzyMatch(X,R) :- x(Z, R), サブセット(X,Z) .

% 2 つのリスト項目を別々に指定し、一致しなかった残りの用語を返します
fuzzyMatch(X,Y,D,M) :- x(Z,D) , select(X,Z,N), select(Y,N,M).

出力:

?- fuzzyMatch('b','a',D)。
D = ab ;
間違い。

?- fuzzyMatch(['b','a'],D)。
D = abcd;
D =アブド;
D = ab ;
D = fXY ;
D = fXY ;
間違い。

?- fuzzyMatch('b','a',R,D)。
R = abcd、
D = [c、d] ;
R =アブド、
D = [d] ;
R = ab、
D = [] ;
R = fXY、
D = [f] ;
R = fXY、
D = [f] ;
間違い。
于 2010-01-12T04:06:05.450 に答える