此prolog查询应返回true,而不是返回列表

时间:2014-02-18 16:03:58

标签: prolog

我正在写下面的prolog程序

pair([],X,[]).
pair([L1], X, [L2]) :- L2 = (L1,X).
pair([H1|L1], X, [H2|L2]) :- pair(L1,X,L2), H2 = (H1,X).

它为此返回true:

pair([1,2,3],a,[(1,a),(2,a),(3,a)]).

以及以下内容:

listOfPairs([]):-[].
listOfPairs([(X,Y)|L]) :- H=(X,Y), listOfPairs(L).

如果列表中的元素是对,则返回true。

现在我有:

pair([a,1,d], 2, L), listOfPairs(L).

,假设返回true,因为L = [ (a, 2), (1, 2), (d, 2)] 并且对列表返回true,但是这个只返回L。我用跟踪看看为什么不起作用,但它确实没有帮助我。

1 个答案:

答案 0 :(得分:1)

首先,需要修复以下条款:

listOfPairs([]):-[].

它将在GNU Prolog中失败,因为[]/0不是现有的谓词。您可以将其更改为:

listOfPairs([]).

接下来,如果你打电话:

pair([a,1,d], 2, L), listOfPairs(L).

你会得到(在GNU Prolog中):

L = [(a,2),(1,2),(d,2)] ? a

L = [(a,2),(1,2),(d,2)]

(1 ms) yes

这表示pair成功显示的值为LlistOfPairs也成功,整个子句成功(因此yes)。

如果您不想看到L的中间值,则需要另一个谓词:

myCheck(X, Y) :-
    pair(X, Y, L),
    listOfPairs(L).

然后你得到:

| ?- myCheck([a,1,d], 2).

true ? a

yes

你应该在SWI Prolog中看到类似的东西(你没有提到你正在使用的翻译)。