3

这是我在 prolog 中的第一个程序,我一直在阅读它,但似乎并没有掌握几个核心概念(我认为)。我正在尝试编写一个函子,它将采用两个列表并仅在第一个列表具有更多元素时才返回 true。我有一些简单的程序可以工作,但我在这里遇到了障碍。我试图在 isLonger 内部调用 size 并将临时变量设置为返回大小。这似乎是在序言中处理此问题的一种糟糕(且不正确)的方式。我得到一个:

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]).

4

1 回答 1

3

一个列表L1L2ifL1不为空且L2为空的要长;或者如果 的尾巴L1比 的尾巴长L2

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

不幸的是,该解决方案会在几个 Prologs 上丢失选择点,这些 Prologs 只能索引第一个参数的谓词。这可以通过颠倒参数顺序来解决:

longer(L1, L2) :- shorter(L2, L1).
shorter([], [_|_]).
shorter([_|T1], [_|T2]) :- shorter(T1, T2)
于 2013-11-12T09:13:41.353 回答