我想按长度比较两个列表,并将输出设置为true或false。比较两个列表?
min(List1, List2, output) :-
length(List1, N),
length(List2, M),
output is N<M.
但我不断收到错误,列表的语法是什么?
我想按长度比较两个列表,并将输出设置为true或false。比较两个列表?
min(List1, List2, output) :-
length(List1, N),
length(List2, M),
output is N<M.
但我不断收到错误,列表的语法是什么?
这里有一些问题; @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'
,其他到'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].
这里的简单变化是:
min(List1, List2, Output) :-
length(List1, N),
length(List2, M),
Output is N<M.
Output
是一个变量,而不是一个名词,所以它应该有一个大写字母开头。
这是否解决您的问题?
不,它给了我一个未定义的过程错误,当我做这样的事情时: – 2010-11-15 02:56:42
min([1,2,3,4],[1,2],X)。 – 2010-11-15 02:57:09
这可能会比解决方案运行得更快, re是一个很小且很大的列表(因为它会在达到最小列表的末尾时立即停止)。
min_list([_|L1t], [_|L2t], Output) :- min(L1t, L2t, Output), !.
min_list(_, [], false).
min_list([], _, true).
关于列表语法所有你需要知道的是,名单表示为[Head|Tail]
,其中Head
是列表和Tail
含有其余元素的子列表的第一个元素。
的!
是切割操作避免回溯探索其他解决方案(如果你不使用它在那里,系统会等待您按下分号,如果你想另外一个答案,然后它会说false
)。
未使用的谓词变量表示为下划线(否则您将收到关于单例变量的警告)。
您忘记了更新'长度=(> =)。' – Kaarel 2010-11-15 10:01:48
@卡雷尔,谢谢,很好的发现;我现在已经做到了一致。 – sharky 2010-11-15 10:13:45
感谢您的解释。 – 2010-11-16 18:36:01