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')。

模糊(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 = bleah2 ;
休息 = [],
D = bleah8 ;
错误的。

?- 对(2,1,D)。
D = bleah8 ;
错误的。

?- 模糊([2,1],R)。
R = 呜呜
R = bleah2 ;
R = bleah8 ;
错误的。

?- 剩余(2,1,D,M)。
D = 呜呜,
M = [3, 4] ;
D = bleah2,
M = [4] ;
D = bleah8,
M = [];
错误的。

然后我添加了一个事实来代表我的下一个潜在案例,现在它已经很糟糕了。我是 Prolog 的新手,我不确定这是为什么或如何解决它。

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

输出:
?- x([1,2|REST],D)。
休息 = [3, 4],
D = 呜呜
休息 = [4],
D = bleah2 ;
休息 = [],
D = bleah8 ;
错误的。

?- 对(2,1,D)。
D = bleah8 ;
错误的。

?- 模糊([2,1],R)。
R = 呜呜
R = bleah2 ;
R = bleah8 ;
错误:> / 2:参数没有充分实例化
^ 例外: (9) _G260+0>7 ? 中止
% 执行中止

?- 剩余(2,1,D,M)。
D = 呜呜,
M = [3, 4] ;
D = bleah2,
M = [4] ;
D = bleah8,
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/2andremaining/4中,您x/2使用未实例化的Z. 这意味着+(因此>)的左侧是未实例化的。

于 2010-01-11T20:33:54.367 回答
1

好的,更改为有限数据类型有帮助!

% 基本比较
相同(X,Y):- X == Y。
大于(X,Y):-小于(Y,X)。

小于(X,Y):- is_lessThan(X,Y)。
小于(X,Y):- is_lessThan(X,Z),小于(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), lessThan(Y,'i')。

% 在 X & Y 中分别指定两个列表项
模糊匹配(X,Y,R):- x([X,Y],R);x([Y,X],R) 。

% 指定列表 X
模糊匹配(X,R):- x(Z,R),子集(X,Z)。

% 分别指定两个列表项,返回不匹配的剩余项
模糊匹配(X,Y,D,M):- x(Z,D),选择(X,Z,N),选择(Y,N,M)。

输出:

?- 模糊匹配('b','a',D)。
D = ab;
错误的。

?-模糊匹配(['b','a'],D)。
D = abcd ;
D = abd;
D = ab;
D = fXY ;
D = fXY ;
错误的。

?- 模糊匹配('b','a',R,D)。
R = abcd,
D = [c, d] ;
R = abd,
D = [d] ;
R = ab,
D = [];
R = fXY,
D = [f] ;
R = fXY,
D = [f] ;
错误的。
于 2010-01-12T04:06:05.450 回答