如果我有这个功能:
min(List1, List2, Output) :-
length(List1, N),
length(List2, M),
( N < M ->
Output = 'true'
; Output = 'false'
).
Run Code Online (Sandbox Code Playgroud)
但如果我还想检查N == M怎么办?也许是这样的:
min(List1, List2, Output) :-
length(List1, N),
length(List2, M),
( N < M ->
Output = 'true'
; ( N = M ->
Output = 'equal'
; Output = 'other'
)
).
Run Code Online (Sandbox Code Playgroud)
似乎没有用.
小智 6
你的implication(->)嵌套在这里看起来是正确的.请注意,在您的定义中,N并且M将是整数(假设调用length/2都成功),因此可以与==而不是统一(=)进行比较.实际上,你甚至可以在SWI-PROLOG中使用算术等于,即=:=:
min(List1, List2, Output) :-
length(List1, N),
length(List2, M),
(N < M ->
Output = 'true'
; (N =:= M ->
Output = 'equal'
; Output = 'other'
)
).
Run Code Online (Sandbox Code Playgroud)
测试:
1 ?- min([a],[b],O).
O = equal.
2 ?- min([a,c],[b],O).
O = other.
3 ?- min([a,c],[b,d],O).
O = equal.
4 ?- min([a,c],[b,d,e],O).
O = true.
Run Code Online (Sandbox Code Playgroud)
在嵌套的if-then-else中,通常会省略多余的括号,从而产生:
min(List1, List2, Output) :-
length(List1, N),
length(List2, M),
( N < M -> Output = true
; N =:= M -> Output = equal
; Output = other
).
Run Code Online (Sandbox Code Playgroud)
在Prolog中,优良作法是在可能的情况下使用模式匹配,因为与使用if-then-else相比,这会产生更通用,更声明性和更具可读性的程序。对于这种特殊情况,请查看compare/3库谓词。compare/3使您可以将两个长度的关系化为一个原子,并可以使用该原子描述与模式匹配有关的三个条件:
lists_output(List1, List2, Output) :-
length(List1, L1),
length(List2, L2),
compare(Order, L1, L2),
order_output(Order, Output).
order_output(<, true).
order_output(=, equal).
order_output(>, other).
Run Code Online (Sandbox Code Playgroud)
示例查询和结果:
?- lists_output([_,_], [_,_,_], Output).
Output = true.
?- lists_output([_,_,_], [_,_,_], Output).
Output = equal.
?- lists_output([_,_,_,_], [_,_,_], Output).
Output = other.
Run Code Online (Sandbox Code Playgroud)