莫道桑榆晚,为霞尚满天。这篇文章主要讲述如何使用append / 3以递归方式在prolog中构建列表?相关的知识,希望能为你提供帮助。
我需要得到一些事实的价值观。那部分似乎有效。
fact1(A, _, Val1, _, _),
fact2(_, B, Val2, _, _),
A = B,
但是一旦我尝试使用append / 3谓词将这些值
[(Val1,Val2)]
附加到List(OutList),我只得到一个可能的解决方案而不是包含所有这些的列表。像这样添加:
append(OutList, [(Val1,Val2)], OutList)
也不起作用。我觉得我在这里缺少一些基本的东西。这是我的谓词到目前为止的样子。
buildList(OutList):-
fact1(A, _, Val1, _, _),
fact2(_, B, Val2, _, _),
A = B,
append([], [(Val1,Val2)], OutList).
有人能指出我犯了一些错误。我知道问题可能很容易找到,但我刚开始使用Prolog /函数式编程。
编辑:如果我有
fact1(a,b,c,d,e).
和fact2(f,a,g,h,i)
,那么我希望我的谓词给我一个列表,所有fact2
第三名值和fact1
第三名值作为元组,其中a
与fact1
匹配。对不起,我有点难以解释。答案你是正确的看看使用findall/3,应该坚持下去。你的问题是你走开了正确的道路。别担心,爱因斯坦对广义相对论做了同样的事情,后者意识到了他的错误并回到了正确的道路上。
第一部分是找到个别项目,第二部分是将它们收集到一个列表中。
鉴于以下事实
fact1(1, _, a, _, _).
fact1(2, _, c, _, _).
fact1(3, _, d, _, _).
fact1(4, _, f, _, _).fact2(_, 1, b, _, _).
fact2(_, 2, c, _, _).
fact2(_, 4, e, _, _).
查找单个项目:
find_item((Val1,Val2)):-
fact1(A, _, Val1, _, _),
fact2(_, A, Val2, _, _).
【如何使用append / 3以递归方式在prolog中构建列表()】然后将它们收集到一个列表中:
findall(Item,find_item(Item),Items).
现在让它更容易使用将它放在谓词中:
test(Items) :-
findall(Item,find_item(Item),Items).
示例运行:
?- test(Items).
Items = [(a, b),(c, c),(f, e)].
请参阅后续question以获得更简单的答案。
推荐阅读
- 具有可扩展列表视图项的Android列表视图
- 来自app.config的bindingRedirect不会在构建时更新exe.config
- Android Studio中的奇怪问题
- UIApplicationLaunchOptionsRemoteNotificationKey没有获取userinfo
- 中断的AVD系统路径。检查您的ANDROID_SDK_ROOT值
- 如何保存安卓系统中摄像头点击的图片()
- Android上的BLE(蓝牙低功耗蓝牙),创建并重新连接到并不总是存在的设备
- 如何修复mapreduce中mapper的setup方法给出的字符串值的不规则行为()
- 无法增加Max Application Master资源