最接近我的技术。
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.
?- 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]
如果您仔细观察,会发现没有使用分号
;
,我确信有些人会遇到问题。此外,所有规则都足够简单,可以通过使用其他参数将它们整合到要求中。例如,
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]]
在截止日期之前,我将继续努力,但如果有人能使用我这里的内容,那么我向他们致敬,只要您在获得答案方面从任何部分得到帮助,请给予信用。
unfold
谓词基于此SO答案。感谢salva
member
是一个老朋友。注意它以[[]]
开始而不是[]
。
swap
我创建了这个谓词。我已经为不同的变体制定了交换工作,但是由于不同的原因,该变体无法成功。
补充
Mat的答案的调试器输出
我仔细查看了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).
感兴趣的部分在右侧作为注释显示。建议您复制此处内容并粘贴到可查看所有行且无换行或隐藏的应用程序中。
左侧列是使用运行trace
查询时SWI-Prolog创建的,右侧的注释是使用运行gtrace
查询时手动复制值并记录缩进级别创建的。
?- word(W).
Call: (8) word(_822) ? creep
Call: (9) p([[]|_1010], _1010, _822) ? creep
Exit: (9) p([[]|_1010], _1010, []) ? creep
Exit: (8) word([]) ? creep
W = [] ;
Redo: (9) p([[]|_1010], _1010, _822) ? creep
Call: (10) p([[a], [b]|_1028], _1028, _822) ? creep
Exit: (10) p([[a], [b]|_1028], _1028, [a]) ? creep
Exit: (9) p([[], [a], [b]|_1028], [[a], [b]|_1028], [a]) ? creep
Exit: (8) word([a]) ? creep
W = [a] ;
Redo: (10) p([[a], [b]|_1028], _1028, _822) ? creep
Call: (11) p([[b], [a, a], [b, a]|_1052], _1052, _822) ? creep
Exit: (11) p([[b], [a, a], [b, a]|_1052], _1052, [b]) ? creep
Exit: (10) p([[a], [b], [a, a], [b, a]|_1052], [[a, a], [b, a]|_1052], [b]) ? creep
Exit: (9) p([[], [a], [b], [a, a], [b, a]|_1052], [[a], [b], [a, a], [b, a]|_1052], [b]) ? creep
Exit: (8) word([b]) ? creep
W = [b] .
Redo: (11) p([[b], [a, a], [b, a]|_1052], _1052, _822) ? creep
Call: (12) p([[a, a], [b, a], [a, b], [b, b]|_1076], _1076, _822) ? creep
Exit: (12) p([[a, a], [b, a], [a, b], [b, b]|_1076], _1076, [a, a]) ? creep
Exit: (11) p([[b], [a, a], [b, a], [a, b], [b, b]|_1076], [[a, b], [b, b]|_1076], [a, a]) ? creep
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
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
Exit: (8) word([a, a]) ? creep
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
Exit: (13) p([[b, a], [a, b], [b, b], [a, a, a], [b, a, a]|_1100], _1100, [b, a]) ? creep
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
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
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
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
Exit: (8) word([b, a]) ? creep
W = [b, a] ;
ABs = W
只是为了防止word/1
有更好的终止属性。实际上,word/1
永远不会终止。它可以找到解决方案,但永远不会终止。即使对于word(non_word)
,它也只是循环。 - falseword/1
的规则只能包含一个目标。不允许使用连接符 (那太高级了:-))。 - falselength/2
和maplist/2
,使用控制结构如并置和分离。然后是这些无法输入的lambda函数... - false