我最近开始学习Prolog,我无法解决如何组合三个列表的问题.
我能够组合2个列表:
%element
element(X,[X|_]).
element(X,[_|Y]):-
element(X,Y).
%union
union([],M,M).
union([X|Y],L,S) :- element(X,L),union(Y,L,S).
union([X|Y],L,[X|S]) :- (not(element(X,L))),union(Y,L,S).
Run Code Online (Sandbox Code Playgroud)
有人可以帮我吗?
到目前为止,我一直坚持 Prolog程序意味着:
如果对于一个查询
Q,有一个subtermS,使得存在一个术语T,使?- S=T, Q.成功虽然?- Q, S=T.失败,然后通过调用一个谓词Q是不踏实.
直觉上,我因此坚定地表示我们不能使用实例化来"欺骗"谓词来提供解决方案,否则这些解决方案不仅不会被给予,而是被拒绝.注意非终止程序的区别!
特别是,至少在我看来,逻辑纯度总是意味着坚定不移.
例子.为了更好地理解坚定性的概念,考虑这个属性的几乎经典的反例,在将高级学生引入Prolog的操作方面时经常引用,使用两个整数之间关系的错误定义及其最大值:
integer_integer_maximum(X, Y, Y) :-
Y >= X,
!.
integer_integer_maximum(X, _, X).
这个中的一个明显错误 - 我们应该说" 摇摆不定 " - 定义当然是以下查询错误地成功:
?- M = 0, integer_integer_maximum(0, 1, M). M = 0. % wrong!
而交换目标产生了正确的答案:
?- integer_integer_maximum(0, 1, M), M = 0. false.
这个问题的一个很好的解决方案是依靠 …
我发布了下面的代码作为这个问题的答案,用户“重复”回答并评论说它在逻辑上不纯粹,“如果您有兴趣对代码进行最小的更改以使其保持逻辑纯度,我建议发布一个新的关于这个问题。我很乐意回答:) “。
% minset_one(1 in D1, 1 in D2, D1, D2, D1Len, D2Len, T).
minset_one_(true, false, D1, _, _, _, D1).
minset_one_(false, true, _, D2, _, _, D2).
minset_one_(true, true, _, D2, D1Len, D2Len, D2) :- D1Len >= D2Len.
minset_one_(true, true, D1, _, D1Len, D2Len, D1) :- D1Len < D2Len.
minset_one(D1, D2, T) :-
(member(1, D1) -> D1check = true ; D1check = false),
(member(1, D2) -> D2check = true ; D2check = false),
length(D1, …Run Code Online (Sandbox Code Playgroud) 我是一个 C# 人,对 prolog 非常陌生。我需要为以下场景编写一个 prolog 程序。任何人都可以帮助实现它。
两个人共用一个抽屉。胸部有 4 个抽屉,抽屉 1 和 2 属于 Person1,抽屉 3 和 4 属于 Person2。
他们把手机、钱包和书放在抽屉里。Person2 在抽屉里丢了手机。他检查了属于他的抽屉 3 和 4,但找不到他的手机。然后他检查了抽屉 1 和 2,在抽屉 2 中找到了它。我需要为此场景编写 prolog 代码。
person(person1).
person(person2).
drawers(drawer1).
drawers(drawer2).
drawers(drawer3).
drawers(drawer4).
belongs_to(drawer1, person1).
belongs_to(drawer2, person1).
belongs_to(drawer3, person2).
belongs_to(drawer4, person2).
item(phone2).
phone_in(drawer).
phone_in(drawer2).
Run Code Online (Sandbox Code Playgroud)
要运行的命令及其结果
?- phone_in(drawer4).
false.
?- phone_in(drawer3).
false.
?- phone_in(drawer1).
false.
?- phone_in(drawer2).
true.
Run Code Online (Sandbox Code Playgroud)
我正在尝试编写如下条件。
?- phone_in(drawer2).
true.
Run Code Online (Sandbox Code Playgroud)
想要根据上述查询的结果(真/假)运行条件。
if(false)
write("phone not found!");
else if(true)
write("please found in your search area");
Run Code Online (Sandbox Code Playgroud)
请建议我改进我的代码。