第一个程序,如果列表1的元素多于列表2,则返回true

时间:2013-11-12 08:52:35

标签: prolog

这是我在prolog中的第一个程序,我一直在阅读它,并且似乎没有掌握一些核心概念(我认为)。我正在尝试编写一个带有两个列表的仿函数,并且仅当第一个列表包含更多元素时才返回true。我已经有了一些简单的程序可以使用,但我在这里遇到了障碍。我正在尝试调用isLonger中的size并将temp变量设置为size的返回值。这似乎是一个糟糕(和不正确)的方式在prolog中解决这个问题。我得到了:

ERROR: >/2: Arguments are not sufficiently instantiated

% List 1

a([cat, dog, horse]).
b([1, 2, 3, 4]).
c([x, [a, b], y, z]).
c([red, yellow, green, blue]).


% isLonger function
isLonger([],[]).
isLonger(L1,L2) :-  A = size(L1,N), B = size(L2,N), A > B.

 % size([],N).
size([_|T],N) :- size(T,N1), N is N1+1.

输入:

isLonger([x,y,z], [7,8,9,10]).

1 个答案:

答案 0 :(得分:3)

如果L1不为空且L2为空,则列表L1的长度超过L2;或者L1的尾部长于L2的尾部。

longer([_|_], []).
longer([_|T1], [_|T2]) :- longer(T1, T2).

不幸的是,这个解决方案会在几个Prolog上留下选择点,这些Prolog只能在第一个参数上为谓词编制索引。这可以通过反转参数顺序来解决:

longer(L1, L2) :- shorter(L2, L1).
shorter([], [_|_]).
shorter([_|T1], [_|T2]) :- shorter(T1, T2)