使用现有元素创建新的prolog列表

时间:2014-03-03 16:25:40

标签: list prolog

我正在尝试创建一个受雇子女列表的名字列表。我真的不能为我的生活看到为什么我正在尝试的这段代码不应该工作。这是使用SWI-Prolog。

    add(X,L,[L|X]).

    removeEmployed([],[]).
        removeEmployed([Child|List],[UCList]):-
        Child = person(X,_,_,unemployed),
        add(X,UCList,UCList),
        removeEmployed(List,UCList),
        UCList is UCList.

任何见解都会受到赞赏,因为我对Prolog很新。是的我在这里检查了其他类似的问题并尝试使用他们的解决方案。 removeEmployed用于以下内容:

q17(MFirst, MSurname,UCList, Total):-
    family(_,
        person(MFirst, MSurname, _,_),
        Children),
    total(Children,Total),
    Total>150000,
    removeEmployed(Children,UCList).

1 个答案:

答案 0 :(得分:0)

在Prolog中这段代码

...
UCList is UCList.

根本没有意义,因为/ 2开始对其右手术语(通常是表达式)进行算术评估。

更重要的是,变量无法“重新分配”。变量是自由的或绑定的,但一旦绑定,它就不能改变它的'值'(一个绑定,真的)。 因此,这个代码也是

...
add(X,UCList,UCList),
...

似乎注定要失败,或者 - 如果UCList会自由 - 创造一个非常奇怪的术语。 看看你能否发现可以从中得到哪种结构。

考虑使用一些更高级别的谓词,比如findall--这将简化您的任务。例如

employed(Children, Employed) :-
  findall(C, member(person(C,_,_,employed), Children), Employed).