首先,我是prolog的新手,我正在尝试写一个谓词长度(M,X,N),如果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 .
我知道prolog以递归方式工作所以我想知道我是否可以像C语言一样构造具有条件的谓词(例如<,>),或者如果在prolog中有另一种方法可以做到这一点。很抱歉这个简单的问题,但我刚开始使用prolog。
答案 0 :(得分:3)
您可以构建更多或更少的谓词。例如:
$('#ES_name').append('(TEST)');
同样地:
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).
这些概念应该有助于启动一些有关如何解决其余问题的想法。
答案 1 :(得分:3)
这个答案跟随@ lurker的精确答案并通过利用提高辅助谓词abs_diff/3
的确定性
first argument clause indexing
介绍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
; .........
)
答案 2 :(得分: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的谓词不会返回值 - 因此他们不会返回true
或false
。他们要么成功要么他们不成功。解释器只是告诉你程序是否成功。