Zer*_*zhi 5 reverse list prolog
假设我有两个任意列表代表3位谓词的前两项:
[anna,berta,charlotte],[charles,bob,andy]
Run Code Online (Sandbox Code Playgroud)
我想匹配第三个列表中的每个项目(3位谓词的第三项),如下所示:
[[anna,andy],[berta,bob],[charlotte,charles]]
Run Code Online (Sandbox Code Playgroud)
基本上,项目以顺序反向方式匹配.为了按顺序匹配项目,我设计了以下代码:
match([],[],[]).
match([A|At],[C|Ct],[[A,C]|Dt]):-match(At,Ct,Dt).
Run Code Online (Sandbox Code Playgroud)
但这会给我以下内容:
match([anna,berta,charlotte],[charles,bob,andy],X).
X=[[anna,charles],[berta,bob],[charlotte,andy]]
Run Code Online (Sandbox Code Playgroud)
所以我需要以某种方式反转第二个列表.到目前为止,我已将代码更改如下:
match([],[],[]).
match([A|At],[C|Ct],[[A,B]|Dt]):-reverse([C|Ct],[B|Bt]),match(At,Bt,Dt).
Run Code Online (Sandbox Code Playgroud)
但是这会在每次传球时不断反转第二个列表.结果如下:
match([anna,berta,charlotte],[charles,bob,andy],X).
X=[[anna,andy],[berta,charles],[charlotte,bob]]
Run Code Online (Sandbox Code Playgroud)
问题:如何仅反转第二个列表,因此实际结果与所需结果相符?或者我的方法是否存在根本缺陷?我是prolog的新手,目前因此而受阻.任何帮助,将不胜感激.
解决只需要应用一次规则的问题的技巧是构建一个辅助规则,该规则在调用递归规则之前和/或之后执行额外的步骤:
match(A, B, R) :- reverse(B, RevB), match_impl(A, RevB, R).
match_impl([], [], []).
match_impl([A|At], [C|Ct], [[A,C]|Dt]) :- match_impl(At, Ct, Dt).
Run Code Online (Sandbox Code Playgroud)
match_impl/3您的match/3规则是否已重命名,以避免与match/3包含辅助步骤的“顶部”规则发生冲突。
| 归档时间: |
|
| 查看次数: |
126 次 |
| 最近记录: |