2017-10-21 39 views
2

首先我完全新的PROLOG和我试图写的谓词长度(M,X,N),这是真实的,如果M不同于ñ比X.谓词在序言其为真,如果M和N相差超过X

更我写了下面测试用例如果M(= Dec.5号)和N(= Dec.2号)不同比X(= Dec.2号)更是如此。正是在这种情况下,正确的,因为5和2的3差别是超过2:

?- length(s(s(s(s(s(0))))), s(s(0)), s(s(0))). 
    true . 

我知道序言工作递归所以我想知道如果我可以构造具有条件这样的谓词(用于例如<,>)就像C语言一样,或者如果在序言中有另一种方法可以做到这一点。对不起,这个简单的问题,但我刚开始prolog。

+0

什么是所有的'dec.5'和单曲的(S(0))'的东西?你应该阅读[问]。 – Enigmativity

回答

3

您可以构建谓词更大或更小。例如:

greater_than(s(_), 0). 
greater_than(s(X), s(Y)) :- 
    greater_than(X, Y). 

而且类似:

less_than(0, s(_)). 
less_than(s(X), s(Y)) :- 
    less_than(X, Y). 

如果你想找到的绝对差异,你可以做这样的事情:

abs_diff(0, 0, 0). 
abs_diff(s(X), 0, s(X)). 
abs_diff(0, s(X), s(X)). 
abs_diff(s(X), s(Y), D) :- 
    abs_diff(X, Y, D). 

这些概念应该帮助踢启动一些如何解决其余问题的想法。

+0

THX你的工具帮了很大忙。那正是我所期待的。我只需要结合。 – SEPS

+0

你知道prolog中的一个命令,我可以强制该长度(0,0,0)导致错误。我需要(0,0,0)导致错误,因为我发现一个测试用例在我的解决方案不起作用。 – SEPS

+0

@SEPS你只需要确保你的规则和事实不允许'长度(0,0,0)'成功。如果查询不成功,则失败。 – lurker

0

试试这个:

?- length(s(s(s(s(s(0))))), s(s(0)), s(s(0))). 

length(s(_),0,0). 
length(s(M),s(X),s(N)) :- length(M,X,N). 

千万记住的Prolog的谓词不返回值的 - 所以他们不返回truefalse。他们要么成功,要么没有。解释者只是告诉你,如果你的程序成功与否。

+0

好的。但是,这只是说,X和N必须是平等的,M可以是任何东西,但它不能是X或N.这有什么好做M和N – SEPS

+0

@SEPS之间的区别 - 不,这表示,m必须是大于N - 或者如你所说“M与N大于X不同”。这是行不通的,M等于或小于N. – Enigmativity

3

这个答案跟在@ lurker的正确答案,并通过利用 first argument clause indexing提高了辅助谓词abs_diff/3的确定性。

介绍x_y_dist/3

x_y_dist(0, Y, Y). 
x_y_dist(s(X), Y, Z) :- 
    y_sx_dist(Y, X, Z). 

y_sx_dist(0, X, s(X)). 
y_sx_dist(s(Y), X, Z) :- 
    x_y_dist(X, Y, Z). 

样品查询:

?- x_y_dist(X, Y, s(s(0))).        % |X-Y| = 2 
( X =   0  , Y =   s(s(0))   % |0-2| = 2 
; X =  s(s(0)) , Y =    0    % |2-0| = 2 
; X =   s(0) , Y =  s(s(s(0)))   % |1-3| = 2 
; X =  s(s(s(0))) , Y =   s(0)    % |3-1| = 2 
; X =  s(s(0)) , Y =  s(s(s(s(0))))   % |2-4| = 2 
; X = s(s(s(s(0)))) , Y =   s(s(0))   % |4-2| = 2 
; X =  s(s(s(0))) , Y = s(s(s(s(s(0)))))   % |3-5| = 2 
; X = s(s(s(s(s(0))))), Y =  s(s(s(0)))   % |5-3| = 2 
; X = s(s(s(s(0)))) , Y = s(s(s(s(s(s(0))))))  % |4-6| = 2 
; ......... 
)