我正在尝试编写一个prolog程序来演示如何使用切割来提高效率。我正在使用以下成员声明来搜索列表。
member(Element, [Element | _]).
member(Element, [_ | List]) :- member(Element, List).
该功能似乎正常工作:
?- member(1,[3,1,4]).
true
我遇到的问题是我需要能够使用具有预先声明列表的成员。像这样:
someList([3,1,4]).
?- somelist(X).
X = [3, 1, 4].
3 ?- member(1,somelist).
false.
即使somelist被定义为[3,1,4],它在第一次测试中起作用,但在调用时返回false。我只需要知道?- member(1,somelist).
返回false时我做错了什么。任何帮助将不胜感激。
答案 0 :(得分:0)
someList是不存在的命题的名称,而不是列表,所以它总是产生false / no。
Prolog接受查询并产生答案。你似乎要求的是命令式语言中变量的概念,这里不存在。
例如,您可以向Prolog询问所有列有member(1, X)
成员的列表,或特定列表member(1, [3,1,4])
,但您无法存储列表并在其中询问这样。
Prolog与知识库合作,通过它所知道的规则/谓词,事实和命题来推断真实性。你需要问问你想知道什么。