0

关于情况的事实——图片

(免费在线 OCR :)警方正试图追查三个一直在炼南瓜的孩子团伙。到目前为止,他们已经确定了以下事实:孩子们的名字是安吉拉、玛丽和大卫;一个是5,一个是7,一个是8;一个姓Diamond,姓Grant的比姓Leung的大3岁。您可以假设安吉拉和玛丽是女性,而大卫是男性。

使用课堂上讨论的斑马示例中显示的技术(代码可在课程网页上找到)查找有关该帮派的缺失信息:每个孩子的年龄、性别、名字和姓氏,与上述数据一致。按原样对上述数据进行编码,不要添加额外的事实。适当地记录您的代码。此外,使用您的 Prolog 代码来显示计算信息是否唯一标识了罪魁祸首。在文件 q2testa.txt 中提交这些测试结果及其含义的简短说明。

(斑马技术示例。)

我认为嫌疑人可以组织如下:

suspect(Angela, _, _, female)
suspect(Mary, _, _, female)
suspect(David, _, _, male)

我也知道年龄排列如下:

suspect( _, Leung, 5, _)
suspect(_, Diamond, 7, _)
suspect(_, Grant,    8, _)

鉴于上述信息,这就是我如何创建 Prolog 函数以生成完整的嫌疑人表的地方。一些帮助将不胜感激。

4

3 回答 3

0

使用一些基本谓词非常简单:

members([],_).
members([M|Ms],Xs) :- select(M,Xs,Ys),members(Ms,Ys).

clue1(Suspects) :- members([[angela,_,_,female],[mary,_,_,female],[david,_,_,male]],Suspects).
clue2(Suspects) :- members([[_,leung,5,_],[_,diamond,7,_],[_,grant,8,_]],Suspects).

solve(Suspects) :-
    Suspects = [[_,_,_,_],[_,_,_,_],[_,_,_,_]],
    clue1(Suspects),
    clue2(Suspects).

这给了我:

?- 解决(X)。
X = [[安吉拉,梁,5,女],[玛丽,钻石,7,女],[大卫,格兰特,8,男]];
X = [[安吉拉,梁,5,女],[玛丽,格兰特,8,女],[大卫,钻石,7,男]];
X = [[安吉拉,钻石,7,女],[玛丽,梁,5,女],[大卫,格兰特,8,男]];
X = [[安吉拉,格兰特,8,女],[玛丽,梁,5,女],[大卫,钻石,7,男]];
X = [[安吉拉,钻石,7,女],[玛丽,格兰特,8,女],[大卫,梁,5,男]];
X = [[安吉拉,格兰特,8,女],[玛丽,钻石,7,女],[大卫,梁,5,男]];
X = [[安吉拉,梁,5,女],[大卫,钻石,7,男],[玛丽,格兰特,8,女]];
X = [[安吉拉,梁,5,女],[大卫,格兰特,8,男],[玛丽,钻石,7,女]];
X = [[安吉拉,钻石,7,女],[大卫,梁,5,男],[玛丽,格兰特,8,女]];
X = [[安吉拉,格兰特,8,女],[大卫,梁,5,男],[玛丽,钻石,7,女]];
X = [[安吉拉,钻石,7,女],[大卫,格兰特,8,男],[玛丽,梁,5,女]];
X = [[angela,grant,8,女],[david,diamond,7,男],[mary,leung,5,女]];
X = [[玛丽,梁,5,女],[安吉拉,钻石,7,女],[大卫,格兰特,8,男]];
X = [[玛丽,梁,5,女],[安吉拉,格兰特,8,女],[大卫,钻石,7,男]];
X = [[玛丽,钻石,7,女],[安吉拉,梁,5,女],[大卫,格兰特,8,男]];
X = [[mary,grant,8,女],[angela,leung,5,女],[david,diamond,7,男]];
X = [[玛丽,钻石,7,女],[安吉拉,格兰特,8,女],[大卫,梁,5,男]];
X = [[玛丽,格兰特,8,女],[安吉拉,钻石,7,女],[大卫,梁,5,男]];
X = [[大卫,梁,5,男],[安吉拉,钻石,7,女],[玛丽,格兰特,8,女]];
X = [[大卫,梁,5,男],[安吉拉,格兰特,8,女],[玛丽,钻石,7,女]];
X = [[大卫,钻石,7,男],[安吉拉,梁,5,女],[玛丽,格兰特,8,女]];
X = [[大卫,格兰特,8,男],[安吉拉,梁,5,女],[玛丽,钻石,7,女]];
X = [[大卫,钻石,7,男],[安吉拉,格兰特,8,女],[玛丽,梁,5,女]];
X = [[大卫,格兰特,8,男],[安吉拉,钻石,7,女],[玛丽,梁,5,女]];
X = [[玛丽,梁,5,女],[大卫,钻石,7,男],[安吉拉,格兰特,8,女]];
X = [[玛丽,梁,5,女],[大卫,格兰特,8,男],[安吉拉,钻石,7,女]];
X = [[玛丽,钻石,7,女],[大卫,梁,5,男],[安吉拉,格兰特,8,女]];
X = [[玛丽,格兰特,8,女],[大卫,梁,5,男],[安吉拉,钻石,7,女]];
X = [[玛丽,钻石,7,女],[大卫,格兰特,8,男],[安吉拉,梁,5,女]];
X = [[玛丽,格兰特,8,女],[大卫,钻石,7,男],[安吉拉,梁,5,女]];
X = [[大卫,梁,5,男],[玛丽,钻石,7,女],[安吉拉,格兰特,8,女]];
X = [[大卫,梁,5,男],[玛丽,格兰特,8,女],[安吉拉,钻石,7,女]];
X = [[大卫,钻石,7,男],[玛丽,梁,5,女],[安吉拉,格兰特,8,女]];
X = [[大卫,格兰特,8,男],[玛丽,梁,5,女],[安吉拉,钻石,7,女]];
X = [[大卫,钻石,7,男],[玛丽,格兰特,8,女],[安吉拉,梁,5,女]];
X = [[大卫,格兰特,8,男],[玛丽,钻石,7,女],[安吉拉,梁,5,女]]。
于 2020-10-23T05:07:28.747 回答
0

要遵循您的方法,您需要做的就是把它写下来:

find4( Kids) :-
  Kids = [ suspect('Angela', _, _, female),
           suspect('Mary', _, _, female),
           suspect('David', _, _, male) ],
  member( suspect( _, 'Leung', 5, _), Kids),
  member( suspect(_, 'Diamond', 7, _), Kids),
  member( suspect(_, 'Grant',    8, _), Kids).

因此,您实际上已经有了“按原样编码数据”的解决方案,尽管它打破了练习中指定的条件。

请注意,以大写字母开头的原子必须用单引号括起来,否则它们将被视为逻辑变量。

(答案的先前版本如下)。


渐进式发展,缓慢前行。

我们的第一次尝试不一定有效,只有最后一次有效。

known1(P) :-
  P = "the kids' first names are Angela, Mary, and David; 
       one is 5, one is 7, and one is 8; 
       one has the last name Diamond, and 
       the one with the last name Grant is 
          3 years older than the one with the Last name Leung. 
       Angela and Mary are female and David is male".

find1(Q) :-
  Q = "each child's age, gender, first name and last name".

known2(P) :-
  P = [ first_names = [Angela, Mary, David],
        ages =        [5,      7,    8    ],
        last_names =  [Diamond, Grant, X  ],
        ages_of = [[Grant, A1], [Leung, A2]],
        ages_diff = [      A1,          A2,    3],
        males =       [              David],
        females =     [Angela, Mary       ] ].

find2(Q) :-
  known2(P),
  ages(P,Q), genders(P,Q), first_names(P,Q), last_names(P,Q).

现在我们已经熟悉了情况,我们继续定义

find3( Kids ) :-
  Kids = [Angela, Mary, David],  first_name( Angela, angela),
                                 first_name( Mary, mary),
                                 first_name( David, david),
  member( Five,  Kids ),  age( Five, 5),
  member( Seven, Kids ),  age( Seven, 7),
  member( Eight, Kids ),  age( Eight, 8),
  member( Diamond, Kids ),  last_name( Diamond, 'Diamond'),
  member( Grant,   Kids ),  last_name( Grant, 'Grant'),
                            age(       Grant, A1),
  member( Leung,   Kids ),  last_name( Leung, 'Leung'),
                            age(       Leung,      A2),
                            3 is              A1 - A2,
                            female( Angela),
                            female( Mary),
                            male(   David).

那么现在我们已经到了这里,我们如何实现那些剩余的谓词age,male等?一厢情愿,就是这样:

first_name( A, N) :- attr( A, first_name-N).
age(        A, N) :- attr( A, age-N).
last_name(  A, N) :- attr( A, last_name-N).
male(       A   ) :- attr( A, gender-male).
female(     A   ) :- attr( A, gender-female).

所以我们已经到了不能再延迟实际实施的地步了:

%% (* our workhorse: *)
attr( Rep, Attr-Value) :- 
    memberchk( Attr-X, Rep),       % unique attribute names
    X = Value.

实际上就是这样:

17 ?- find3(_Kids), maplist(writeln, _Kids).
[first_name-angela,age-5,last_name-Leung,gender-female|_G5742]
[first_name-mary,age-7,last_name-Diamond,gender-female|_G5751]
[first_name-david,age-8,last_name-Grant,gender-male|_G5760]
true .

(以及更多 5 个解决方案)。

于 2020-11-29T14:44:39.487 回答
0

:- op(1,'xfy','contains') .

puzzle(CULPRITs)
:-
there_are_three_culprits(CULPRITs) ,
the_set_of_first_names_is_known(CULPRITs) ,
the_set_of_last_names_is_known(CULPRITs) ,
the_set_of_ages_is_known(CULPRITs) ,
one_is_three_years_older(CULPRITs)
.

there_are_three_culprits(CULPRITs)
:-
length(CULPRITs,3)
.

the_set_of_first_names_is_known(CULPRITs)
:-
CULPRITs contains {first_name:'Angela',last_name:_,age:_} ,
CULPRITs contains {first_name:'Mary',last_name:_,age:_} ,
CULPRITs contains {first_name:'David',last_name:_,age:_}
.

the_set_of_last_names_is_known(CULPRITs)
:-
CULPRITs contains {first_name:_,last_name:'Diamond',age:_} ,
CULPRITs contains {first_name:_,last_name:'Grant',age:_} ,
CULPRITs contains {first_name:_,last_name:'Leung',age:_}
.

the_set_of_ages_is_known(CULPRITs)
:-
CULPRITs contains {first_name:_,last_name:_,age:5} ,
CULPRITs contains {first_name:_,last_name:_,age:7} ,
CULPRITs contains {first_name:_,last_name:_,age:8}
.

one_is_three_years_older(CULPRITs)
:-
CULPRITs contains {first_name:_,last_name:'Grant',age:AGE_GRANT} ,
CULPRITs contains {first_name:_,last_name:'Leung',age:AGE_LEUNG} ,
AGE_GRANT is AGE_LEUNG + 3
.

CULPRITs contains CULPRIT
:-
prolog:member(CULPRIT,CULPRITs)
.


这个谜题没有明确的答案。有了给定的线索,仍然有 36 种可能的解决方案。

/*
?- puzzle(CULPRITs).

CULPRITs = [{first_name:'Angela', last_name:'Diamond', age:7}, {first_name:'Mary', last_name:'Grant', age:8}, {first_name:'David', last_name:'Leung', age:5}] ;
CULPRITs = [{first_name:'Angela', last_name:'Diamond', age:7}, {first_name:'Mary', last_name:'Leung', age:5}, {first_name:'David', last_name:'Grant', age:8}] ;
CULPRITs = [{first_name:'Angela', last_name:'Grant', age:8}, {first_name:'Mary', last_name:'Diamond', age:7}, {first_name:'David', last_name:'Leung', age:5}] ;
CULPRITs = [{first_name:'Angela', last_name:'Leung', age:5}, {first_name:'Mary', last_name:'Diamond', age:7}, {first_name:'David', last_name:'Grant', age:8}] ;
CULPRITs = [{first_name:'Angela', last_name:'Grant', age:8}, {first_name:'Mary', last_name:'Leung', age:5}, {first_name:'David', last_name:'Diamond', age:7}] ;
CULPRITs = [{first_name:'Angela', last_name:'Leung', age:5}, {first_name:'Mary', last_name:'Grant', age:8}, {first_name:'David', last_name:'Diamond', age:7}] ;
CULPRITs = [{first_name:'Angela', last_name:'Diamond', age:7}, {first_name:'David', last_name:'Grant', age:8}, {first_name:'Mary', last_name:'Leung', age:5}] ;
CULPRITs = [{first_name:'Angela', last_name:'Diamond', age:7}, {first_name:'David', last_name:'Leung', age:5}, {first_name:'Mary', last_name:'Grant', age:8}] ;
CULPRITs = [{first_name:'Angela', last_name:'Grant', age:8}, {first_name:'David', last_name:'Diamond', age:7}, {first_name:'Mary', last_name:'Leung', age:5}] ;
CULPRITs = [{first_name:'Angela', last_name:'Leung', age:5}, {first_name:'David', last_name:'Diamond', age:7}, {first_name:'Mary', last_name:'Grant', age:8}] ;
CULPRITs = [{first_name:'Angela', last_name:'Grant', age:8}, {first_name:'David', last_name:'Leung', age:5}, {first_name:'Mary', last_name:'Diamond', age:7}] ;
CULPRITs = [{first_name:'Angela', last_name:'Leung', age:5}, {first_name:'David', last_name:'Grant', age:8}, {first_name:'Mary', last_name:'Diamond', age:7}] ;
CULPRITs = [{first_name:'Mary', last_name:'Diamond', age:7}, {first_name:'Angela', last_name:'Grant', age:8}, {first_name:'David', last_name:'Leung', age:5}] ;
CULPRITs = [{first_name:'Mary', last_name:'Diamond', age:7}, {first_name:'Angela', last_name:'Leung', age:5}, {first_name:'David', last_name:'Grant', age:8}] ;
CULPRITs = [{first_name:'Mary', last_name:'Grant', age:8}, {first_name:'Angela', last_name:'Diamond', age:7}, {first_name:'David', last_name:'Leung', age:5}] ;
CULPRITs = [{first_name:'Mary', last_name:'Leung', age:5}, {first_name:'Angela', last_name:'Diamond', age:7}, {first_name:'David', last_name:'Grant', age:8}] ;
CULPRITs = [{first_name:'Mary', last_name:'Grant', age:8}, {first_name:'Angela', last_name:'Leung', age:5}, {first_name:'David', last_name:'Diamond', age:7}] ;
CULPRITs = [{first_name:'Mary', last_name:'Leung', age:5}, {first_name:'Angela', last_name:'Grant', age:8}, {first_name:'David', last_name:'Diamond', age:7}] ;
CULPRITs = [{first_name:'David', last_name:'Diamond', age:7}, {first_name:'Angela', last_name:'Grant', age:8}, {first_name:'Mary', last_name:'Leung', age:5}] ;
CULPRITs = [{first_name:'David', last_name:'Diamond', age:7}, {first_name:'Angela', last_name:'Leung', age:5}, {first_name:'Mary', last_name:'Grant', age:8}] ;
CULPRITs = [{first_name:'David', last_name:'Grant', age:8}, {first_name:'Angela', last_name:'Diamond', age:7}, {first_name:'Mary', last_name:'Leung', age:5}] ;
CULPRITs = [{first_name:'David', last_name:'Leung', age:5}, {first_name:'Angela', last_name:'Diamond', age:7}, {first_name:'Mary', last_name:'Grant', age:8}] ;
CULPRITs = [{first_name:'David', last_name:'Grant', age:8}, {first_name:'Angela', last_name:'Leung', age:5}, {first_name:'Mary', last_name:'Diamond', age:7}] ;
CULPRITs = [{first_name:'David', last_name:'Leung', age:5}, {first_name:'Angela', last_name:'Grant', age:8}, {first_name:'Mary', last_name:'Diamond', age:7}] ;
CULPRITs = [{first_name:'Mary', last_name:'Diamond', age:7}, {first_name:'David', last_name:'Grant', age:8}, {first_name:'Angela', last_name:'Leung', age:5}] ;
CULPRITs = [{first_name:'Mary', last_name:'Diamond', age:7}, {first_name:'David', last_name:'Leung', age:5}, {first_name:'Angela', last_name:'Grant', age:8}] ;
CULPRITs = [{first_name:'Mary', last_name:'Grant', age:8}, {first_name:'David', last_name:'Diamond', age:7}, {first_name:'Angela', last_name:'Leung', age:5}] ;
CULPRITs = [{first_name:'Mary', last_name:'Leung', age:5}, {first_name:'David', last_name:'Diamond', age:7}, {first_name:'Angela', last_name:'Grant', age:8}] ;
CULPRITs = [{first_name:'Mary', last_name:'Grant', age:8}, {first_name:'David', last_name:'Leung', age:5}, {first_name:'Angela', last_name:'Diamond', age:7}] ;
CULPRITs = [{first_name:'Mary', last_name:'Leung', age:5}, {first_name:'David', last_name:'Grant', age:8}, {first_name:'Angela', last_name:'Diamond', age:7}] ;
CULPRITs = [{first_name:'David', last_name:'Diamond', age:7}, {first_name:'Mary', last_name:'Grant', age:8}, {first_name:'Angela', last_name:'Leung', age:5}] ;
CULPRITs = [{first_name:'David', last_name:'Diamond', age:7}, {first_name:'Mary', last_name:'Leung', age:5}, {first_name:'Angela', last_name:'Grant', age:8}] ;
CULPRITs = [{first_name:'David', last_name:'Grant', age:8}, {first_name:'Mary', last_name:'Diamond', age:7}, {first_name:'Angela', last_name:'Leung', age:5}] ;
CULPRITs = [{first_name:'David', last_name:'Leung', age:5}, {first_name:'Mary', last_name:'Diamond', age:7}, {first_name:'Angela', last_name:'Grant', age:8}] ;
CULPRITs = [{first_name:'David', last_name:'Grant', age:8}, {first_name:'Mary', last_name:'Leung', age:5}, {first_name:'Angela', last_name:'Diamond', age:7}] ;
CULPRITs = [{first_name:'David', last_name:'Leung', age:5}, {first_name:'Mary', last_name:'Grant', age:8}, {first_name:'Angela', last_name:'Diamond', age:7}] ;
false .
*/

于 2020-10-22T05:11:56.827 回答