相关疑难解决方法(0)

AUBUC的Prolog联盟

我最近开始学习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)

有人可以帮我吗?

list prolog

20
推荐指数
2
解决办法
2605
查看次数

坚定性:定义及其与逻辑纯度和终止的关系

到目前为止,我一直坚持 Prolog程序意味着:

如果对于一个查询Q,有一个subterm S,使得存在一个术语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.

这个问题的一个很好的解决方案是依靠 …

prolog non-termination logical-purity steadfastness

12
推荐指数
1
解决办法
296
查看次数

对我的代码进行哪些最小的更改才能使其保持逻辑纯度?

我发布了下面的代码作为这个问题的答案用户“重复”回答并评论说它在逻辑上不纯粹,“如果您有兴趣对代码进行最小的更改以使其保持逻辑纯度,我建议发布一个新的关于这个问题。我很乐意回答:) “。

% 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)

prolog logical-purity

4
推荐指数
2
解决办法
91
查看次数

如何在 Prolog 中编写 IF ELSE 条件

我是一个 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)

请建议我改进我的代码。

if-statement prolog

3
推荐指数
1
解决办法
2万
查看次数