我是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规则只是立即退出并且根本没有调用组合规则。
答案 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
除第一个元素以外的所有元素。
这很重要:绝不会忽略编译警告。你得到的代码可以做某些事情,但你几乎可以肯定它没有做你想做的事情,这很糟糕,或者如果别人读你的代码,他们会感到困惑,这也很糟糕。