刚刚介绍了prolog,尝试通过一些简单的练习,但我一直在坚持这个.我正在尝试编写一个输出输入列表的所有子列表的程序,其中每个子列表的长度> 1,并且不能扩展到更大的子列表.它还将输出子列表列表中的起始位置.所以样本输出就是
| ?- plateau([a,a,b,2,2,2,a+1,a+1,s(1,2)], I, Len).
I = 1,
Len = 2 ? ;
I = 4,
Len = 3 ? ;
I = 7,
Len = 2 ? ;
no
Run Code Online (Sandbox Code Playgroud)
我仍然对整个声明性事物感到困惑,并且在切换到命令式模式时遇到了很多麻烦.我想我希望我的程序可以做类似的事情
program([H|T],I,L):-
T = [H1|T1] %split the tail
([H] = [H1] -> Count is Count+1, program(T,I,Count)
%if First element = second element, recurse with new values
; length(T,Spot),
%get the spot where you are in the list, so we know where sublist starts
program(T,Spot,L) %run again, from tail, …Run Code Online (Sandbox Code Playgroud) 我正在阅读Raymond Smullyan的"嘲笑模仿鸟".在书中有一个谜题是这样的:
这个故事的塞维利亚与西班牙着名的塞维利亚(实际上没有)之间的任何相似之处纯属巧合.在这个神秘的塞维利亚小镇,男性居民戴着假发,只有他们感觉喜欢的那些日子.没有两个居民在所有日子里都表现得一样; 也就是说,如果任何两个男性居民,至少有一天他们中的一个戴着假发而另一个则不戴.鉴于任何男性居民X和Y,居民Y据说是X的追随者,如果在X所有的日子里戴假发.此外,如果居民X,Y和Z,如果Z在X和Y都做的所有日子都佩戴假发,则居民Z被称为X和Y的追随者.
其中五名居民被命名为Alfredo,Bernardo,Ben-ito,Roberto和Ramano.以下事实是关于它们的:
事实1 ......贝尔纳多和贝尼托在他们的假发习惯方面相反; 也就是说,在任何一天,其中一个戴假发,另一个戴假发.
事实2:罗伯托和拉马诺同样是对立的.
事实3:拉马诺戴着假发,只有在阿尔弗雷多和贝尼托都戴上假发的那几天.
塞维利亚只有一个理发师,以下事实是关于他的:
事实4:贝尔纳多是阿尔弗雷多和理发师的追随者.
事实5:鉴于任何男性居民X,如果Bernardo是Alfredo和X的下属,那么理发师就是X的追随者.
阿尔弗雷多只穿黑色假发; 贝尔纳多只穿白色假发; 贝尼托只穿灰色假发; 罗伯托只穿红色假发; 而Ramano只戴着棕色假发.
一个复活节早晨,理发师戴着假发.他穿的是什么颜色?
我发现在Prolog中解决这个问题会很有趣,但我很早就陷入了困境:
isOpposite( bernardo, benito ).
isOpposite( benito , bernardo ).
isOpposite( roberto , ramano ).
isOpposite( ramano , roberto ).
wears( alfredo , black ).
wears( bernardo, white ).
wears( benito , gray ).
wears( roberto , red ).
wears( ramano , brown ).
whatWearsTheBarber( WigColor ) :-
member( Barber, [ alfredo, benito, bernardo, roberto, ramano ] ),
wears( Barber, WigColor …Run Code Online (Sandbox Code Playgroud) 我开始学习Prolog.该程序试图获取给定元素的所有出现:
occurences(_, [], Res):- Res is [].
occurences(X, [X|T], Res):-
occurences(X,T,TMP),
Res is [X,TMP].
occurences(X, [_|T], Res):- occurences(X,T,Res).
Run Code Online (Sandbox Code Playgroud)
但这是错误:
?- occurences(a,[a,b,c,a],Res).
ERROR: is/2: Arithmetic: `[]/0' is not a function
^ Exception: (11) _G525 is [] ? creep
Exception: (10) occurences(a, [], _G524) ? creep
Exception: (9) occurences(a, [a], _G524) ? creep
Exception: (8) occurences(a, [c, a], _G524) ? creep
Exception: (7) occurences(a, [b, c, a], _G524) ? creep
Exception: (6) occurences(a, [a, b, c, a], _G400) ? creep
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个简单的过程来检查列表是否有任何重复.这是我到目前为止所尝试的:
% returns true if the list has no duplicate items.
no_duplicates([X|XS]) :- member(X,XS) -> false ; no_duplicates(XS).
no_duplicates([]) :- true.
Run Code Online (Sandbox Code Playgroud)
如果我试试no_duplicates([1,2,3,3]).它说的是真的.为什么是这样?我可能在这里误解了Prolog,但任何帮助都表示赞赏.
鉴于CFG
S --> a S b | c | d
Run Code Online (Sandbox Code Playgroud)
我想写一个谓词,如语法('S',句子),它可以产生所有可能的
sentences like
sentence=acb,
sentence=acd,
sentence=c,
sentence=ab......................
Run Code Online (Sandbox Code Playgroud)
使用最左边的推导,如果遇到的符号是终端,它应该打印出该终端,如果遇到的符号是非终端 'S',它应该回溯并替换其中一个语法a S b或c或d并重复处理.
我不想要任何代码......只是帮我提一些如何开始的提示
我想访问列表排列并将其作为参数传递给其他函数.
这是排列代码:
takeout(X,[X|R],R).
takeout(X,[F|R],[F|S]) :-
takeout(X,R,S),
write(S).
perm([X|Y],Z) :-
perm(Y,W),
takeout(X,Z,W).
perm([],[]).
Run Code Online (Sandbox Code Playgroud) 消除列表元素的连续重复.
我的解决方案是:
compress([X,X|Xs], Q) :-
compress([X|Xs], Q).
compress([X,Y|Xs], Q) :-
X \= Y,
compress([Y|Xs], QR),
append([X], QR, Q).
compress([X|[]], Q) :-
compress([], QR),
append([X], QR, Q).
compress([], []).
Run Code Online (Sandbox Code Playgroud)
并且,由于我是初学者并且我没有逻辑范例的经验,我请求您说出我可以改进的内容以及为什么我的解决方案不尽如人意.
例如,X \= Y对我来说并不漂亮.
在下面的查询中,首先我得到了X = H128,它来自哪里?还为什么它回来了?是因为变量X实际上没有定义,我们正在测试这个条件?
?- not(X==3).
X = H128
yes
Run Code Online (Sandbox Code Playgroud) 编写一个谓词,allDistinct/1其参数是符号列表,如果列表中的所有符号都不同,则成功.
notin(A,[]).
notin(A,[B|C]) :-
A\=B,
notin(A,C).
allDistinct([]).
allDistinct([_]).
allDistinct([A|B]) :-
notin(A,B),
allDistinct(B).
Run Code Online (Sandbox Code Playgroud)我正在七周的七种语言中工作,但有一些我对prolog不了解.我有以下程序(基于他们的华莱士和grommit程序):
/* teams.pl */
onTeam(a, aTeam).
onTeam(b, aTeam).
onTeam(b, superTeam).
onTeam(c, superTeam).
teamMate(X, Y) :- \+(X = Y), onTeam(X, Z), onTeam(Y, Z).
Run Code Online (Sandbox Code Playgroud)
并像这样加载它
?- ['teams.pl'].
true.
Run Code Online (Sandbox Code Playgroud)
但它没有给我任何解决方案
?- teamMate(a, X).
false.
Run Code Online (Sandbox Code Playgroud)
它可以解决更简单的东西(在书中显示):
?- onTeam(b, X).
X = aTeam ;
X = superTeam.
Run Code Online (Sandbox Code Playgroud)
有解决方案:
?- teamMate(a, b).
true ;
false.
Run Code Online (Sandbox Code Playgroud)
我错过了什么?我尝试了gnu prolog和swipl.
......还有更多......
当你移动"不能成为你自己的队友"的限制然后结束:
/* teams.pl */
onTeam(a, aTeam).
onTeam(b, aTeam).
onTeam(b, superTeam).
onTeam(c, superTeam).
teamMate(X, Y) :- onTeam(X, Z), onTeam(Y, Z), \+(X = Y).
Run Code Online (Sandbox Code Playgroud)
它给了我期望的解决方案:
?- ['teams.pl'].
true. …Run Code Online (Sandbox Code Playgroud)