我正在尝试按长度比较两个列表,并将输出设置为true或false。
min(List1, List2, output) :-
length(List1, N),
length(List2, M),
output is N<M.
但是我一直在收到错误,这些列表的语法是什么?
答案 0 :(得分:3)
这里有几个问题; @Enigmativity是正确的,你需要使Output
变量,但is/2
没有在运算符<
上定义(它用于评估算术表达式,如+
,或those that are user defined)。
相反,请考虑以下事项:
min(List1, List2, Output) :-
length(List1, N),
length(List2, M),
(N < M ->
Output = 'true'
; Output = 'false'
).
此处,N < M
是逻辑测试,无论是成功还是失败。 如果 N < M
为真,则隐含->
会指示解释器将Output
变量绑定到原子'true'
, else 到'false'
,表示您要求的列表之间的长度关系。你可以随意绑定任何东西,而不仅仅是原子。
执行此操作会给出:
?- min([1,2,3,4],[1,2],Output).
Output = false.
如果您希望min/3
只返回两个输入列表中较小的一个,您可以尝试:
min(List1, List2, Output) :-
length(List1, N),
length(List2, M),
(N < M ->
Output = List1
; Output = List2
).
在同一个例子上执行此操作会给出:
?- min([1,2,3,4],[1,2],X).
X = [1, 2].
答案 1 :(得分:0)
这可能比解决方案运行得更快,而不是比较长度,如果有一个小的和一个非常大的列表(因为它会在达到最小列表的末尾时停止)。
min_list([_|L1t], [_|L2t], Output) :- min(L1t, L2t, Output), !.
min_list(_, [], false).
min_list([], _, true).
关于列表语法,您需要知道的是列表表示为[Head|Tail]
,其中Head
是列表的第一个元素,Tail
是包含其余元素的子列表。
!
是 cut operator 以避免回溯以探索其他解决方案(如果您不在那里使用它,系统将等待您按分号如果您想要另一个答案,然后会说false
)。
未使用的谓词变量表示为下划线(否则您将收到有关单例变量的警告)。
答案 2 :(得分:-1)
这里的简单变化是:
min(List1, List2, Output) :-
length(List1, N),
length(List2, M),
Output is N<M.
Output
是一个变量,而不是一个术语,所以它应该以大写字母开头。
这能解决您的问题吗?