我认为我遇到的问题非常愚蠢,但无法找到在线搜索的答案。我希望函数总是返回一个元素列表,即使列表只包含一个元素。我不知道prolog中是否总是这样(即一个元素列表被转换为一个简单的常量)但在这里我将详细介绍。
首先,我有一组谓词(如composeBase(<,<,[<]).
),基于我所讨论的函数compose/3
进行计算:
compose(X, Y, Z):-
compositionBase(X,Y,Z).
因此,例如,compose/3
执行此操作:
compose(<, <, L).
L = (<) .
compose(<, =, L).
L = (<) .
compose(=, =, L).
L = (=) .
那么,为什么在第一个示例中,如果谓词说[<]
,它不会返回composeBase(<,<,[<]).
?有没有办法让它返回列表[<]
而不是?
如果没有或者我的问题没有任何意义,那么这就是问题所在而无法解决的问题(如果有的话,甚至不愿意继续阅读当然!:)除非你想给我一些关于我的天真代码的建议,我会非常感谢你作为一个新手。)
我必须编写一个函数composeList/3
,给定两个元素列表,它应该计算一个列表,其中包含两个元素中所有可能的元素组合。
因此,例如,composeList/3
应该这样做:
composeList([<], [<, =], L).
L = [<, =] .
composeList([<,=], [<, =], L).
L = [<, =] .
以下是代码:
composeList(_,[],[]).
composeList([],_,[]).
composeList([X| Xs], [Y| Ys], L):-
compose(X,Y,L1),
composeList(Xs, [Y| Ys], L2),
composeList([X| Xs], Ys, L3),
union(L1, L2, L4),
union(L3,L4,L).
因此,正如trace.
确认的那样,我认为当compose/3
返回一个简单常量而不是列表时会出现问题。例如,在上面的示例中,它返回false .
因为,因为L1设置为<
,所以第一个联合失败。我该如何以随意的方式解决这个问题?
顺便说一句,这是trace.
的作用:
[trace] 123 ?- compositionListe([<],[<,=],L).
Call: (7) compositionListe([<], [<, =], _G8032) ? creep
Call: (8) compose(<, <, _G8122) ? creep
Call: (9) compositionBase(<, <, _G8122) ? creep
Exit: (9) compositionBase(<, <, [<]) ? creep
Exit: (8) compose(<, <, [<]) ? creep
Call: (8) compositionListe([], [<, =], _G8128) ? creep
Exit: (8) compositionListe([], [<, =], []) ? creep
Call: (8) compositionListe([<], [=], _G8131) ? creep
Call: (9) compose(<, =, _G8131) ? creep
Exit: (9) compose(<, =, <) ? creep
Call: (9) compositionListe([], [=], _G8134) ? creep
Exit: (9) compositionListe([], [=], []) ? creep
Call: (9) compositionListe([<], [], _G8137) ? creep
Exit: (9) compositionListe([<], [], []) ? creep
Call: (9) lists:union(<, [], _G8137) ? creep
Fail: (9) lists:union(<, [], _G8137) ? creep
非常感谢你!