在受限域中表示唯一性

时间:2019-05-19 14:43:28

标签: prolog

提供一些功能:

' ...\encode.py '

我对函数获取/返回的确切值不感兴趣,但是我想知道输入的 sign 如何影响输出。

要对大于函数建模,我使用原子define foo(x,y) (x > y) end. define bar(x) (foo x x) end. define baz(x,y) (foo x y) end. ,它被解释为zero_int0,它们被解释为所有大于pos_int和{{1 }}解释为小于0的所有整数。

neg_int

0谓词用于在存在选择点时返回%% pos_int greater then ... %% i.e forall n,m : (n > 0) & (m = 0) => n is_greater_than m gt(pos_int,zero_int,true). gt(pos_int,neg_int,true). gt(pos_int, pos_int, X) :- boolean(X). % return either true or false. %% zero greater than ... gt(zero_int, pos_int, false). gt(zero_int,zero_int,false). gt(zero_int, neg_int, true). %% neg int greater than... gt(neg_int, pos_int, false). gt(neg_int, zero_int, false). gt(neg_int, neg_int, X) :- boolean(X). boolean/1。即比较true,其中falsen > m可能为true或false。由于我们不知道n > 0m > 0的实际(整数)值假设两种情况都成立。

n

现在,我通过以下方式对函数进行编码:

m

测试%% define booleans boolean(true). boolean(false). (和foo(X,Y,Return) :- gt(X,Y,Return). bar(X,Return) :- foo(X,X,Return). baz(X,Y,Return) :- foo(X,Y,Return). ),我们得到了预期的结果:

foo

我的问题是,因为baz用单个值调用?- foo(X,Y,Return). X = pos_int, Y = zero_int, Return = true ; X = pos_int, Y = neg_int, Return = true ; X = Y, Y = pos_int, Return = true ; X = Y, Y = pos_int, Return = false ; X = zero_int, Y = pos_int, Return = false ; ... -我希望它总是返回bar,因为从来没有像gt < / p>

false

我对如何进行编码感兴趣。我已经探索过使用成对的变量作为输入,以便可以比较标签

1 个答案:

答案 0 :(得分:0)

您可以尝试

boolean(true).
boolean(false).

gt2((_, pos_int), (_, zero_int), (_,true)).
gt2((_, pos_int), (_, neg_int),  (_,true)).
gt2((L1, pos_int), (L2, pos_int), (_,X)) :- not(L1 == L2), boolean(X).
%% zero greater than ...
gt2((_, zero_int), (_, pos_int),  (_,false)).
gt2((_, zero_int), (_, zero_int), (_,false)).
gt2((_, zero_int), (_, neg_int),  (_,true)).
%% neg int greater than...
gt2((_, neg_int), (_, pos_int), (_,false)).
gt2((_, neg_int), (_, zero_int), (_,false)).
gt2((L1, neg_int), (L2, neg_int), (_,X)) :- not(L1 == L2), boolean(X).

gt2((L,pos_int),(L,pos_int),(_,false)).
gt2((L,neg_int),(L,neg_int),(_,false)).

foo(X,Y,Return) :- gt2(X,Y,Return).
bar(X,Return) :- foo(X,X,Return).
baz(X,Y,Return) :- foo(X,Y,Return).

这使用了 labels 的思想,该思想允许我们标记输入,以便我们可以编码相等性。基本上,如果标签匹配,则输入严格相等。 (即给定正整数 set 内的两个输入,如果它们具有相同的标签,则它们 是相同的整数。 会得出结果:

?- bar(X,R).
X =  (_31408, zero_int),
R =  (_31414, false) ;
X =  (_31408, pos_int),
R =  (_31414, false) ;
X =  (_31408, neg_int),
R =  (_31414, false).

?- foo(X,Y,R).
X =  (_31852, pos_int),
Y =  (_31858, zero_int),
R =  (_31864, true) ;
X =  (_31852, pos_int),
Y =  (_31858, neg_int),
R =  (_31864, true) ;
X =  (_31852, pos_int),
Y =  (_31858, pos_int),
R =  (_31864, true) ;
X =  (_31852, pos_int),
Y =  (_31858, pos_int),
R =  (_31864, false) ;
X =  (_31852, zero_int),
Y =  (_31858, pos_int),
R =  (_31864, false) ;
X =  (_31852, zero_int),
Y =  (_31858, zero_int),
R =  (_31864, false) ;
X =  (_31852, zero_int),
Y =  (_31858, neg_int),
R =  (_31864, true) ;
X =  (_31852, neg_int),
Y =  (_31858, pos_int),
R =  (_31864, false) ;
X =  (_31852, neg_int),
Y =  (_31858, zero_int),
R =  (_31864, false) ;
X =  (_31852, neg_int),
Y =  (_31858, neg_int),
R =  (_31864, true) ;
X =  (_31852, neg_int),
Y =  (_31858, neg_int),
R =  (_31864, false) ;
X = Y, Y =  (_31852, pos_int),
R =  (_31864, false) ;
X = Y, Y =  (_31852, neg_int),
R =  (_31864, false).

请注意,当标签相同时,foo会产生额外的输入。