Prolog:由一个元素组成的列表

时间:2015-11-29 15:45:23

标签: list prolog

我认为我遇到的问题非常愚蠢,但无法找到在线搜索的答案。我希望函数总是返回一个元素列表,即使列表只包含一个元素。我不知道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

非常感谢你!

0 个答案:

没有答案