2010-11-15 161 views
1

我想按长度比较两个列表,并将输出设置为true或false。比较两个列表?

min(List1, List2, output) :- 
    length(List1, N), 
    length(List2, M), 
     output is N<M. 

但我不断收到错误,列表的语法是什么?

回答

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'其他'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]. 
+0

您忘记了更新'长度=(> =)。' – Kaarel 2010-11-15 10:01:48

+0

@卡雷尔,谢谢,很好的发现;我现在已经做到了一致。 – sharky 2010-11-15 10:13:45

+0

感谢您的解释。 – 2010-11-16 18:36:01

-1

这里的简单变化是:

min(List1, List2, Output) :- 
    length(List1, N), 
    length(List2, M), 
    Output is N<M. 

Output是一个变量,而不是一个名词,所以它应该有一个大写字母开头。

这是否解决您的问题?

+0

不,它给了我一个未定义的过程错误,当我做这样的事情时: – 2010-11-15 02:56:42

+0

min([1,2,3,4],[1,2],X)。 – 2010-11-15 02:57:09

0

这可能会比解决方案运行得更快, re是一个很小且很大的列表(因为它会在达到最小列表的末尾时立即停止)。

min_list([_|L1t], [_|L2t], Output) :- min(L1t, L2t, Output), !. 
min_list(_, [], false). 
min_list([], _, true). 

关于列表语法所有你需要知道的是,名单表示为[Head|Tail],其中Head是列表和Tail含有其余元素的子列表的第一个元素。

!切割操作避免回溯探索其他解决方案(如果你不使用它在那里,系统会等待您按下分号,如果你想另外一个答案,然后它会说false)。

未使用的谓词变量表示为下划线(否则您将收到关于单例变量的警告)。