我目前正在尝试编写一个Prolog程序,它将一个给定的字符添加到列表的末尾。我想要追加的列表是列表中的元素。这就是我现在所拥有的。
class Contact(object):
def __init__(self, name, surname, phone):
self.name = name
self.surname = surname
self.phone = phone
class ContactDatabase:
def __init__(self, *args):
self.inner_list = list(args)
def add_contact(self, new_contact):
self.inner_list.append(new_contact)
# Initial contacts
contact1 = Contact('Mark', 'Doe', '123456789')
contact2 = Contact('Sally', 'Preston', '456789123')
# Creating a database
my_database = ContactDatabase(contact1, contact2)
# Adding new contacts later
my_database.add_contact(Contact('Jim', 'Miller', '111223123'))
这里我试图连接X和Head,将它存储在Y中。但是我希望Y是一个列表列表,所以当它再次重复该过程时,下一个连接也将存储在Y中。所以在程序结束Y将存储所有连接的结果。我希望结果如下所示。
extends(X, [], []).
extends(X, [[Head]|Lists], Y):-
append([X], [Head], Y),
extends(X, Lists, [Y]).
有人可以帮我解决这个问题吗?
答案 0 :(得分:1)
extends(PostFix, ListIn, ListOut) :-
maplist({PostFix}/[In,Out]>>append(In,[PostFix],Out),ListIn, ListOut).
这是使用library(yall)
一个maplist/3
和append/3
。
答案 1 :(得分:1)
您想要将一些操作应用于两个列表的相应元素。该操作涉及列表本身。很容易与嵌套级别的列表混淆,所以让我们尝试不来思考这些术语。相反,首先定义一个执行 one 列表扩展的谓词:
element_list_extended(Element, List, Extended) :-
append(List, [Element], Extended).
此行为如下,使用示例中的案例:
?- element_list_extended(a, [b, c], Extended).
Extended = [b, c, a].
?- element_list_extended(a, List, [x, y, z, a]).
List = [x, y, z] ;
false.
到目前为止看起来不错。我们需要做的就是将此操作应用于两个列表的相应元素:
extends(_Element, [], []).
extends(Element, [Xs | Xss], [Ys | Yss]) :-
element_list_extended(Element, Xs, Ys),
extends(Element, Xss, Yss).
这有效:
?- extends(a, [[b,c], [d,e,f], [x,y,z]], Y).
Y = [[b, c, a], [d, e, f, a], [x, y, z, a]] ;
false.
使其成功的关键是将问题分解为两部分并分别解决这些更简单的部分。
现在,如果我们愿意,由于element_list_extended/3
的定义是包含单个目标的单个子句,我们可能决定不使用它并将其定义内联到extends/3
:
extends(_Element, [], []).
extends(Element, [Xs | Xss], [Ys | Yss]) :-
append(Xs, [Element], Ys),
extends(Element, Xss, Yss).
如你所见,你非常接近!你只是有一些多余的括号,因为你对列表嵌套感到困惑。这正是分解问题的原因所在。
(正如另一个答案所说,SWI-Prolog有一些有用的库,甚至可以用更短的代码表达它。)