鉴于word/1,
word(W) :-
abs(ABs),
ABs = W.
abs([]).
abs([AB|ABs]) :-
abs(ABs),
ab(AB).
ab(a).
ab(b).
?- word(W).
W = []
; W = [a]
; W = [b]
; W = [a,a]
; W = [b,a]
; W = [a,b]
; W = [b,b]
; W = [a,a,a]
; W = [b,a,a]
; W = [a,b,a]
; W = [b,b,a]
; W = [a,a,b]
; W = [b,a,b]
; W = [a,b,b]
; W = [b,b,b]
; W = [a,a,a,a]
...
Run Code Online (Sandbox Code Playgroud)
如何更紧凑的word/1外观定义,否则相同的wrt终止和解决方案集,公平性,具有以下约束:
没有像内置插件那样使用(=)/2.
不使用像(',')/2or (;)/2或or 这样的控制结构call/1.
使用一个事实,一个递归规则和一个规则word/1.
也许更简单的是要求条款F1...... F4在:
word(W) :-
p(F1).
p(F2).
p(F3) :-
p(F4).
Run Code Online (Sandbox Code Playgroud)
对于记录:此处利用的属性与终止单个二元子句的不可判定性密切相关.赞美归于:
Philippe Devienne,PatrickLebègue,Jean-Christophe Routier和JörgWürtz. 一个二进制喇叭子句足够 STACS '94.
mat*_*mat 11
我提出的解决方案是:
word(W) :-
p([[]|Ls], Ls, W).
p([W|_], _, W).
p([W0|Ws], [[a|W0],[b|W0]|Ls], W) :-
p(Ws, Ls, W).
示例查询和答案:
?- word(W). W = [] ; W = [a] ; W = [b] ; W = [a, a] ; W = [b, a] ; W = [a, b] ; W = [b, b] ; W = [a, a, a] ; W = [b, a, a] ; W = [a, b, a] ; W = [b, b, a] ; W = [a, a, b] ; W = [b, a, b] ; W = [a, b, b] ; W = [b, b, b] ; W = [a, a, a, a] ; W = [b, a, a, a] ; etc.
我正在使用差异列表逐步实现我想要顶层报告的解决方案.
好的,所以还没有答案.
我最接近的是:
s_s1([],[a]).
s_s1([b|T],[a|T]).
s_s1([a|T],[b|T2]):-
s_s1(T,T2).
word([]).
word(W2):-
word(W),
s_s1(W,W2).
Run Code Online (Sandbox Code Playgroud)
哪个不符合标准或给出正确的解决方案!
接下来我认为我们可以尝试使用prolog来找到答案..结构是给定的,所以我们需要搜索args ..
%First define the first 16 correct solutions..
correct_sols(X):-
X=[
[],
[a],
[b],
[a,a],
[b,a],
[a,b],
[b,b],
[a,a,a],
[b,a,a],
[a,b,a],
[b,b,a],
[a,a,b],
[b,a,b],
[a,b,b],
[b,b,b],
[a,a,a,a]
].
%Then a mi
provable(true, _) :- !.
provable((G1,G2), Defs) :- !,
provable(G1, Defs),
provable(G2, Defs).
provable(BI, _) :-
predicate_property(BI, built_in),
!,
call(BI).
provable(Goal, Defs) :-
member(Def, Defs),
copy_term(Def, Goal-Body),
provable(Body, Defs).
%From 4 Vars find 16 solutions to word(X)
vars_16sols(Vars,List):-
Vars =[Args,Args0,Args1,Argsx],
findnsols(16,X,provable(word(X),[
a(Args)-true,
a(Args0)-a(Args1),
word(X)-a(Argsx)]
),List).
%Evaluate the score, for the solutions found how many match correct
evaluate_score(Solutions,Score):-
correct_sols(C),
maplist(correct_test_tf,C,Solutions,TrueFalse),
findall(_,member(true,TrueFalse),Matches),
length(Matches,Score).
%The main search, give a form for the starting 4 arguments, if they
match all 16 correct stop.
startingargs_solution(Start,Sol):-
vars_16sols(Start,SolsStart),
evaluate_score(SolsStart,Score),
Score =16,
SolsStart=Sol.
%Othewise refine args, and try again.
startingargs_solution(Start,Sol):-
vars_16sols(Start,SolsStart),
evaluate_score(SolsStart,Score),
Score <16,
start_refined(Start,Refined),
startingargs_solution(Refined,Sol).
Run Code Online (Sandbox Code Playgroud)
我们仍然需要定义:
a和b某处,可能[].显然没有完成,也不确定是否可以这样做,但我想我会发一个答案,看看有什么人要说的......目前搜索还很天真!
这只是测试前16个解决方案,但也许这足以得到正确的答案..
也许这比自己解决问题更难!
我最近的.
unfold20([], []).
unfold20([H|T], [[a|H], [b|H]|L]) :-
unfold20(T, L).
member20(X, [X|_]).
member20(X, [_|Tail]) :-
member20(X, Tail).
swap20(R,R) :-
write('swap20 R: '),write(R),nl.
swap20(In,L) :-
write('swap20 In: '),write(In),nl,
unfold20(In,L),
swap20(L,_),
write('swap20 L: '),write(L),nl.
word20(W) :-
swap20([[]],L),
write('word20 L: '),write(L),nl,
member20(W,L),
write('word20 W: '),write(W),nl.
Run Code Online (Sandbox Code Playgroud)
?- word20(X).
swap20 R: [[]]
word20 L: [[]]
word20 W: []
X = [] ;
swap20 In: [[]]
swap20 R: [[a],[b]]
swap20 L: [[a],[b]]
word20 L: [[a],[b]]
word20 W: [a]
X = [a] ;
word20 W: [b]
X = [b] ;
swap20 In: [[a],[b]]
swap20 R: [[a,a],[b,a],[a,b],[b,b]]
swap20 L: [[a,a],[b,a],[a,b],[b,b]]
swap20 L: [[a],[b]]
word20 L: [[a],[b]]
word20 W: [a]
X = [a] ;
word20 W: [b]
X = [b] ;
swap20 In: [[a,a],[b,a],[a,b],[b,b]]
swap20 R: [[a,a,a],[b,a,a],[a,b,a],[b,b,a],[a,a,b],[b,a,b],[a,b,b],[b,b,b]]
swap20 L: [[a,a,a],[b,a,a],[a,b,a],[b,b,a],[a,a,b],[b,a,b],[a,b,b],[b,b,b]]
swap20 L: [[a,a],[b,a],[a,b],[b,b]]
swap20 L: [[a],[b]]
word20 L: [[a],[b]]
word20 W: [a]
X = [a] ;
word20 W: [b]
X = [b] ;
swap20 In: [[a,a,a],[b,a,a],[a,b,a],[b,b,a],[a,a,b],[b,a,b],[a,b,b],[b,b,b]]
swap20 R: [[a,a,a,a],[b,a,a,a],[a,b,a,a],[b,b,a,a],[a,a,b,a],[b,a,b,a],[a,b,b,a],[b,b,b,a],[a,a,a,b],[b,a,a,b],[a,b,a,b],[b,b,a,b],[a,a,b,b],[b,a,b,b],[a,b,b,b],[b,b,b,b]]
swap20 L: [[a,a,a,a],[b,a,a,a],[a,b,a,a],[b,b,a,a],[a,a,b,a],[b,a,b,a],[a,b,b,a],[b,b,b,a],[a,a,a,b],[b,a,a,b],[a,b,a,b],[b,b,a,b],[a,a,b,b],[b,a,b,b],[a,b,b,b],[b,b,b,b]]
swap20 L: [[a,a,a],[b,a,a],[a,b,a],[b,b,a],[a,a,b],[b,a,b],[a,b,b],[b,b,b]]
swap20 L: [[a,a],[b,a],[a,b],[b,b]]
swap20 L: [[a],[b]]
word20 L: [[a],[b]]
word20 W: [a]
X = [a]
Run Code Online (Sandbox Code Playgroud)
如果你看,你会看到没有用;,我相信有些人有问题.此外,所有规则都很简单,它们应该能够通过使用其他参数折叠到需求中.例如,unfold(A,B)会变成unfold(A,B,C,D)或变异.
这个版本的问题在于,随着评估的进展,我得到了正确的答案,它只是让他们回到顶层.
例如
swap20 L: [[a,a,a],[b,a,a],[a,b,a],[b,b,a],[a,a,b],[b,a,b],[a,b,b],[b,b,b]]
swap20 L: [[a,a],[b,a],[a,b],[b,b]]
swap20 L: [[a],[b]]
Run Code Online (Sandbox Code Playgroud)
我将在死寂之前继续努力,但如果有人能够使用我在这里的东西,请向他们致敬,我只要求你给予信任,如果这部分有助于你得到答案.
member是个老朋友.请注意,它始于[[]]和不[].
swap我创建了这个谓词.我有交换工作的不同变化,但变化失败的原因不同.
我用调试器更仔细地看了Mat的答案,因为它可以解决类似的问题,我可以生成答案,但不能将它们独立地返回到Top.
Mat的答案复制在这里供参考.
p([W|_], _, W).
p([W0|Ws], [[a|W0],[b|W0]|Ls], W) :-
p(Ws, Ls, W).
word(W) :-
p([[]|Ls], Ls, W).
Run Code Online (Sandbox Code Playgroud)
感兴趣的部分是评论的右侧.我建议您从这里复制并过去进入一个应用程序,它允许您查看所有的行而不包装或隐藏.
左侧的列是使用运行查询的SWI-Prolog trace创建的,右侧的注释是通过运行查询gtrace并手动复制值并注意缩进级别来创建的.
?- word(W).
Call: (8) word(_822) ? creep % word(W) :-
Call: (9) p([[]|_1010], _1010, _822) ? creep % p([[]|Ls], Ls, W).
Exit: (9) p([[]|_1010], _1010, []) ? creep % p([W|_], _, W). % W = []
Exit: (8) word([]) ? creep % p([[]|Ls], Ls, W). % W = []
W = [] ;
Redo: (9) p([[]|_1010], _1010, _822) ? creep % p([W0|Ws], [[a|W0],[b|W0]|Ls], W) :- % W0 = [] Ws = [[a],[b]|Ls]
Call: (10) p([[a], [b]|_1028], _1028, _822) ? creep % p(Ws, Ls, W). % W0 = [] Ws = [[a],[b]|Ls]
Exit: (10) p([[a], [b]|_1028], _1028, [a]) ? creep % p([W|_], _, W). % W = [a]
Exit: (9) p([[], [a], [b]|_1028], [[a], [b]|_1028], [a]) ? creep % p(Ws, Ls, W). % W = [a] W0 = [] Ws = [[a],[b]|Ls]
Exit: (8) word([a]) ? creep % p([[]|Ls], Ls, W). % W = [a] Ls = [[a],[b]|_2312]
W = [a] ;
Redo: (10) p([[a], [b]|_1028], _1028, _822) ? creep % p([W0|Ws], [[a|W0],[b|W0]|Ls], W) :- % W0 = [a] Ws = [ [b],[a,a],[b,a]|Ls]
Call: (11) p([[b], [a, a], [b, a]|_1052], _1052, _822) ? creep % p(Ws, Ls, W). % W0 = [a] Ws = [ [b],[a,a],[b,a]|Ls]
Exit: (11) p([[b], [a, a], [b, a]|_1052], _1052, [b]) ? creep % p([W|_], _, W). % W = [b]
Exit: (10) p([[a], [b], [a, a], [b, a]|_1052], [[a, a], [b, a]|_1052], [b]) ? creep % p(Ws, Ls, W). % W = [b] W0 = [a] Ws = [ [b],[a,a],[b,a]|Ls]
Exit: (9) p([[], [a], [b], [a, a], [b, a]|_1052], [[a], [b], [a, a], [b, a]|_1052], [b]) ? creep % p(Ws, Ls, W). % W = [b] W0 = [] Ws = [[a],[b],[a,a],[b,a]|_2324] Ls = [ [a,a],[b,a]|_2324]
Exit: (8) word([b]) ? creep % p([[]|Ls], Ls, W). % W = [b] Ls = [[a],[b],[a,a],[b,a]|_2324]
W = [b] .
Redo: (11) p([[b], [a, a], [b, a]|_1052], _1052, _822) ? creep % p([W0|Ws], [[a|W0],[b|W0]|Ls], W) :- % W0 = [b] Ws = [ [a,a],[b,a],[a,b],[b,b]|Ls]
Call: (12) p([[a, a], [b, a], [a, b], [b, b]|_1076], _1076, _822) ? creep % p(Ws, Ls, W). % W0 = [b] Ws = [ [a,a],[b,a],[a,b],[b,b]|Ls]
Exit: (12) p([[a, a], [b, a], [a, b], [b, b]|_1076], _1076, [a, a]) ? creep % p([W|_], _, W). % W = [a,a]
Exit: (11) p([[b], [a, a], [b, a], [a, b], [b, b]|_1076], [[a, b], [b, b]|_1076], [a, a]) ? creep % p(Ws, Ls, W). % W = [a,a] W0 = [b] Ws = [ [a,a],[b,a],[a,b],[b,b]|Ls]
Exit: (10) p([[a], [b], [a, a], [b, a], [a, b], [b, b]|_1076], [[a, a], [b, a], [a, b], [b, b]|_1076], [a, a]) ? creep % p(Ws, Ls, W). % W = [a,a] W0 = [a] Ws = [ [b],[a,a],[b,a],[a,b],[b,b]|_2348] Ls = [ [a,b],[b,b]|_2348]
Exit: (9) p([[], [a], [b], [a, a], [b, a], [a, b], [b|...]|_1076], [[a], [b], [a, a], [b, a], [a, b], [b, b]|_1076], [a, a]) ? creep % p(Ws, Ls, W). % W = [a,a] W0 = [] Ws = [[a],[b],[a,a],[b,a],[a,b],[b,b]|_2348] Ls = [ [a,a],[b,a],[a,b],[b,b]|_2348]
Exit: (8) word([a, a]) ? creep % p([[]|Ls], Ls, W). % W = [a,a] Ls = [[a],[b],[a,a],[b,a],[a,b],[b,b]|_2348]
W = [a, a] ;
Redo: (12) p([[a, a], [b, a], [a, b], [b, b]|_1076], _1076, _822) ? creep
Call: (13) p([[b, a], [a, b], [b, b], [a, a, a], [b, a, a]|_1100], _1100, _822) ? creep % p([W0|Ws], [[a|W0],[b|W0]|Ls], W) :- % W0 = [a,a] Ws = [ [b,a],[a,b],[b,b],[a,a,a],[b,a,a]|Ls]
Exit: (13) p([[b, a], [a, b], [b, b], [a, a, a], [b, a, a]|_1100], _1100, [b, a]) ? creep % p(Ws, Ls, W). % W0 = [a,a] Ws = [ [b,a],[a,b],[b,b],[a,a,a],[b,a,a]|Ls]
Exit: (12) p([[a, a], [b, a], [a, b], [b, b], [a, a, a], [b, a|...]|_1100], [[a, a, a], [b, a, a]|_1100], [b, a]) ? creep % p([W|_], _, W). % W = [b,a]
Exit: (11) p([[b], [a, a], [b, a], [a, b], [b, b], [a, a|...], [b|...]|_1100], [[a, b], [b, b], [a, a, a], [b, a, a]|_1100], [b, a]) ? creep % p(Ws, Ls, W). % W = [b,a] W0 = [a,a] Ws = [ [b,a],[a,b],[b,b],[a,a,a],[b,a,a]|Ls]
Exit: (10) p([[a], [b], [a, a], [b, a], [a, b], [b, b], [a|...], [...|...]|...], [[a, a], [b, a], [a, b], [b, b], [a, a, a], [b, a|...]|_1100], [b, a]) ? creep % p(Ws, Ls, W). % W = [b,a] W0 = [b] Ws = [ [a,a],[b,a],[a,b],[b,b],[a,a,a],[b,a,a]|_2372] Ls = [ [a,a,a],[b,a,a]|_2372]
Exit: (9) p([[], [a], [b], [a, a], [b, a], [a, b], [b|...], [...|...]|...], [[a], [b], [a, a], [b, a], [a, b], [b, b], [a|...], [...|...]|...], [b, a]) ? creep % p(Ws, Ls, W). % W = [b,a] W0 = [a] Ws = [ [b],[a,a],[b,a],[a,b],[b,b],[a,a,a],[b,a,a]|_2372] Ls = [ [a,b],[b,b],[a,a,a],[b,a,a]|_2372]
Exit: (8) word([b, a]) ? creep % p(Ws, Ls, W). % W = [b,a] W0 = [] Ws = [[a],[b],[a,a],[b,a],[a,b],[b,b],[a,a,a],[b,a,a]|_2372] Ls = [ [a,a],[b,a],[a,b],[b,b],[a,a,a],[b,a,a]|_2372]
W = [b, a] ; % p([[]|Ls], Ls, W). % W = [b,a] Ls = [[a],[b],[a,a],[b,a],[a,b],[b,b],[a,a,a],[b,a,a]|_2372]
Run Code Online (Sandbox Code Playgroud)
通常我会将这些作为单个答案发布,但@false要求我将它们分开.
如果你阅读我的评论和答案,你会发现我知道我必须将结果从一次迭代传递回下一次迭代.让我深入了解的是使用我发现的跨产品谓词
Richard A. O'Keefe pg."Prolog的工艺".243
如果你认真学习Prolog,这本书是必备的.
引用前言
有许多介绍Prolog的书籍.这不是其中的一个.把它想象成"Prolog的第二步".如果您已经阅读过一本入门书籍,如果您已经学习了Prolog的入门课程,如果您已经编写过两个Prolog程序,并且如果您想知道为什么仍然难以编写好的Prolog程序,那么这本书是意在帮助你.本书的目的是向您展示如何编写有效的Prolog程序,这些程序不会花费不合理的时间,并且足够干净以便向您的朋友展示.
这是一个轻微的变化,我用于一个不起作用的变体.
combine(X,Y,[X,Y]).
product(P,Xs,Ys,PXYs) :-
product1(Xs,Ys,PXYs,P).
product1([],_,[],_).
product1([X|Xs],Ys,PXYs0,P) :-
product1(Ys,X,P,PXYs0,PXYs1),
product1(Xs,Ys,PXYs1,P).
product1([],_,_) --> [].
product1([Y|Ys],X,P) -->
{
call(P,X,Y,PXY)
},
[PXY],
product1(Ys,X,P).
?- product(combine,[a,b],[a,b],R).
R = [[a, a], [a, b], [b, a], [b, b]].
Run Code Online (Sandbox Code Playgroud)