我正在写下面的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。我用跟踪看看为什么不起作用,但它确实没有帮助我。
答案 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
成功显示的值为L
。 listOfPairs
也成功,整个子句成功(因此yes
)。
如果您不想看到L
的中间值,则需要另一个谓词:
myCheck(X, Y) :-
pair(X, Y, L),
listOfPairs(L).
然后你得到:
| ?- myCheck([a,1,d], 2).
true ? a
yes
你应该在SWI Prolog中看到类似的东西(你没有提到你正在使用的翻译)。