如果我有这个功能:
min(List1, List2, Output) :-
length(List1, N),
length(List2, M),
( N < M ->
Output = 'true'
; Output = 'false'
).
但如果我还想检查N == M怎么办?也许是这样的:
min(List1, List2, Output) :-
length(List1, N),
length(List2, M),
( N < M ->
Output = 'true'
; ( N = M ->
Output = 'equal'
; Output = 'other'
)
).
似乎不起作用。
答案 0 :(得分:5)
在嵌套的if-then-else中,通常省略多余的括号,产生:
min(List1, List2, Output) :-
length(List1, N),
length(List2, M),
( N < M -> Output = true
; N =:= M -> Output = equal
; Output = other
).
在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).
示例查询和结果:
?- lists_output([_,_], [_,_,_], Output).
Output = true.
?- lists_output([_,_,_], [_,_,_], Output).
Output = equal.
?- lists_output([_,_,_,_], [_,_,_], Output).
Output = other.
答案 1 :(得分:4)
你的蕴涵嵌套(->
)在这里看起来是正确的。请注意,在您的定义中,N
和M
将是整数(假设对length/2
的调用都成功),因此可以与==
进行比较而不是统一({ {1}})。实际上,您甚至可以在SWI-PROLOG中使用算术等于=
:
=:=
测试:
min(List1, List2, Output) :-
length(List1, N),
length(List2, M),
(N < M ->
Output = 'true'
; (N =:= M ->
Output = 'equal'
; Output = 'other'
)
).