List 在prolog中访问列表中的列表元素以对其进行操作
我已经花了一个小时来解决这个问题,但我一点运气都没有 如果我有这样的清单List 在prolog中访问列表中的列表元素以对其进行操作,list,prolog,List,Prolog,我已经花了一个小时来解决这个问题,但我一点运气都没有 如果我有这样的清单 [[tom, dick, harry], [janice, jane, jess]] 他们有关系 happy(tom). happy(dick). happy(harry). happy(janice). unhappy(jane). unhappy(jess). 我想逐一查询每个列表,看看他们是不高兴还是高兴。目前我已经编写了两个函数来处理这个问题,它们是 %% Female happiness checker hc
[[tom, dick, harry], [janice, jane, jess]]
他们有关系
happy(tom).
happy(dick).
happy(harry).
happy(janice).
unhappy(jane).
unhappy(jess).
我想逐一查询每个列表,看看他们是不高兴还是高兴。目前我已经编写了两个函数来处理这个问题,它们是
%% Female happiness checker
hcf([]).
hcf([H|T]) :-
happy(H),
hcf(T).
%% Male happiness checker
hcm([]).
hcm([H|T]) :-
happy(H),
hcM(T).
因此,目前这些都是可行的。如果我投入
hcm([Janice, jess, jane]).
false
它返回false,因为两个人不快乐
我遇到的问题是写一个函数,它允许我将列表中的每个列表传递到每个男性和女性幸福的相应函数中
到目前为止,我已经尝试了一些类似于
%% I was trying to get a HEAD list and a TAIL list to pass them through but didn't have much luck
happnieschecker([[]])
happnieschecker([[H|T]]) :-
some code here
编辑:我希望程序像这样运行
happinesschecker([tom, dick, harry], [janice, jane, jess]).
false - since jane and jess are unhappy
happinesschecker([tom, dick, harry], [janice]).
true - since everyone is happy
所以我的问题是,我怎样才能将女性的每一秒列表传递到HCF,而男性的每一秒列表传递到HCM
happynesschecker(Ms, Fs) :-
allhappy(Ms), % more compactly: maplist(happy,Ms).
allhappy(Fs).
allhappy([]).
allhappy([P|Ps]) :-
happy(P),
allhappy(Ps).
注意,相同的谓词可用于男性和女性列表
对于人员名单:
extrahappy(Mss) :-
maplist(maplist(happy), Mss).
或者更详细地说:
extrahappy([]).
extrahappy([Ps|Pss]) :-
allhappy(Ps),
extrahappy(Pss).
序言列表([A,b,c]
)是数据结构/2
的语法糖,空列表由原子[]
表示
- 列表
与[a]
完全相同(a,[])
- 列表
与[a,b]
完全相同(a,.(b,[])
- 列表
与[a,b,c]
完全相同(a,.(b,.(c,[]))
|
操作符将列表划分为头和尾
- 符号
与`(a,X)完全相同[a | X]
- 符号
与[a,b | X]
完全相同(a,(b,X))
- 符号
与[a,b,c | X]
(a,b,c,X))
[ [bob,ted] , [carol,alice] , [tom,dick,harry] , [jane,sally,simone] ]
像这样的东西应该适合你
everybody_happy( [] ) . % the empty list is all happy
everybody_happy( [Ms] ) :- % a list of length 1 contains a male sublist
findall( M , (member(M,Ms),happy(M)) , Ms ) % is everybody happy?
. %
everybody_happy( [Ms,Fs|Ps] ) :- % a list of length 2+ starts with a male and female sublist
findall( M , (member(M,Ms),happy(M)) , Ms ) , % are all the boys happy?
findall( F , (member(F,Fs),happy(F)) , Fs ) , % are all the girls happy?
everybody_happy(Ps) % is the remainder of the list happy?
. % easy!
我在这里使用的是findall/3
。如果您想使用自己的快乐检查器,只需将findall/3
替换为您的实现:
everybody_happy( [] ) . % the empty list is all happy
everybody_happy( [Ms] ) :- % a list of length 1 contains a male sublist
is_happy(Ms) % is everybody happy?
. %
everybody_happy( [Ms,Fs|Ps] ) :- % a list of length 2+ starts with a male and female sublist
is_happy( Ms ) , % are all the boys happy?
is_happy( Fs ) , % are all the girls happy?
everybody_happy(Ps) % is the remainder of the list happy?
. % easy!
is_happy([]). % the empty list is happy
is_happy([P|Ps] ) :- % a non-empty list is happy IF...
happy(P) , % - its head is happy, and
is_happy(Ps) % - its tail is happy
. % easy!
编辑说明:如果要放弃第一项,请尝试以下操作
everybody_happy( [_|Xs] ) :-
every_body_happy_1( Xs )
.
其中
Everyone\u happy\u 1/1
是实际谓词。给出了一个如何使用关系的示例!假装它已经写好了。@false我的道歉,完全忽略了,如果我在列表中有3个列表呢?男性,女性,男性谢谢你的完整回答和解释!Nicholas Carey,有没有一种特别的方法可以在使用这个时忽略列表中的第一个元素?i、 e.总是从索引1而不是索引0开始递归?变量\uuu
是匿名变量。它的每个实例,即使在同一个谓词中,也是唯一的,因此类似于1?-\u3、\u4.
的计算结果为true
。你可能想买Sterling&Shapiro's。它将帮助您了解Prolog。我最终只是拆分了H和T,并调用了上面的函数,如split([H | T]):-everbody_happy(T)。)@吉姆:请注意,第一个版本的Everyone_happy([[X]])。
如果有多个快乐的人,就会错误地失败。