Prolog初学者。如何将列表作为参数并传递给它

时间:2014-12-15 12:28:28

标签: prolog

我是Prolog的初学者。我正在努力创建一个规则,它将列表作为参数并将列表传递给另一个规则。这是我的代码:

combine([], '').
combine([L|List], Total) :-
    combine(List, CombinedRest),
    atom_concat(L, CombinedRest, Total).

findHeadline([W|Words], Combined) :- 
    combine(Words, Combined).

findHeadline2([Words], Combined) :- 
    combine(Words, Combined).

findHeadline按预期工作,但findHeadline2没有。这是输出:

1 ?- findHeadline([billig, enkeltmand], Combination).
Combination = enkeltmand.

2 ?- findHeadline2([billig, enkeltmand], Combination).
false.

我期望从findHeadline获得的输出是:

Combination = billigenkeltmand.

这怎么可能不起作用?

我尝试在SWI-prolog中使用trace,但它没有给我任何线索,因为findHeadline规则只是立即退出并且根本没有调用组合规则。

1 个答案:

答案 0 :(得分:1)

目前还不是很清楚你追求的是什么。如果您只想连接原子列表以获得一个原子,请使用SWI-Prolog中提供的atomic_list_concat/2

?- atomic_list_concat([foo, bar, baz], C).
C = foobarbaz.

目前,您的findHeadline2/2读取:

"列出一个只包含一个元素的列表,并combine/2该元素。"

这不是你想要的,我有这种感觉。

另一方面,您的findHeadline/2说:

"列出至少一个元素,combine/2除第一个元素以外的所有元素。

这很重要:绝不会忽略编译警告。你得到的代码可以做某些事情,但你几乎可以肯定它没有做你想做的事情,这很糟糕,或者如果别人读你的代码,他们会感到困惑,这也很糟糕。