From 2beb450df613e6d34186571f6379f1212c970666 Mon Sep 17 00:00:00 2001 From: Paul Chaignon Date: Mon, 10 Feb 2014 18:10:20 +0100 Subject: [PATCH] Support of the .pro file extension for Prolog. --- lib/linguist/heuristics.rb | 13 ++++++ lib/linguist/languages.yml | 1 + samples/Prolog/logic-problem.pro | 68 ++++++++++++++++++++++++++++++++ test/test_heuristics.rb | 12 ++++++ 4 files changed, 94 insertions(+) create mode 100644 samples/Prolog/logic-problem.pro diff --git a/lib/linguist/heuristics.rb b/lib/linguist/heuristics.rb index a3de46e9..95232f9b 100644 --- a/lib/linguist/heuristics.rb +++ b/lib/linguist/heuristics.rb @@ -22,6 +22,9 @@ module Linguist if languages.all? { |l| ["ECL", "Prolog"].include?(l) } disambiguate_ecl(data, languages) end + if languages.all? { |l| ["IDL", "Prolog"].include?(l) } + disambiguate_pro(data, languages) + end if languages.all? { |l| ["TypeScript", "XML"].include?(l) } disambiguate_ts(data, languages) end @@ -56,6 +59,16 @@ module Linguist matches end + def self.disambiguate_pro(data, languages) + matches = [] + if (data.include?(":-")) + matches << Language["Prolog"] + else + matches << Language["IDL"] + end + matches + end + def self.disambiguate_ts(data, languages) matches = [] if (data.include?("")) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 6c692b9b..82cc4be4 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -1325,6 +1325,7 @@ Prolog: extensions: - .ecl - .pl + - .pro Protocol Buffer: type: markup diff --git a/samples/Prolog/logic-problem.pro b/samples/Prolog/logic-problem.pro new file mode 100644 index 00000000..b70120bf --- /dev/null +++ b/samples/Prolog/logic-problem.pro @@ -0,0 +1,68 @@ +/** + * Question 1.1 + * combiner(+Buddies, -Pairs) + */ +combiner([], []). +combiner([First|Buddies], Pairs):- + make_pairs(First, Buddies, Pairs1), + combiner(Buddies, Pairs2), + concat(Pairs1, Pairs2, Pairs). + +/** + * make_pairs(+Buddy, +Buddies, -Pairs) + */ +make_pairs(Buddy, [], []). +make_pairs(Buddy, [First|Buddies], [(Buddy, First)|Pairs]):- + make_pairs(Buddy, Buddies, Pairs). + +/** + * concat(+X, +Y, ?T) + */ +concat([], Y, Y). +concat([P|R], Y, [P|T]):- + concat(R, Y, T). + + +/** + * Question 1.2 + * extraire(+AllPossiblePairs, +NbPairs, -Tp, -RemainingPairs) + */ +extraire(AllPossiblePairs, 0, [], AllPossiblePairs). +extraire([PossiblePair|AllPossiblePairs], NbPairs, [PossiblePair|Tp], NewRemainingPairs):- + NbPairs > 0, + NewNbPairs is NbPairs - 1, + extraire(AllPossiblePairs, NewNbPairs, Tp, RemainingPairs), + not(pair_in_array(PossiblePair, Tp)), + delete_pair(RemainingPairs, PossiblePair, NewRemainingPairs). +extraire([PossiblePair|AllPossiblePairs], NbPairs, Tp, [PossiblePair|RemainingPairs]):- + NbPairs > 0, + extraire(AllPossiblePairs, NbPairs, Tp, RemainingPairs), + pair_in_array(PossiblePair, Tp). + +/** + * delete_pair(+Pairs, +Pair, -PairsWithoutPair) + */ +delete_pair([], _, []). +delete_pair([Pair|Pairs], Pair, Pairs):-!. +delete_pair([FirstPair|Pairs], Pair, [FirstPair|PairsWithoutPair]):- + delete_pair(Pairs, Pair, PairsWithoutPair). + +/** + * pair_in_array(+Pair, +Pairs) + */ +pair_in_array((A, B), [(C, D)|Pairs]):- + (A == C ; B == D ; A == D ; B == C), + !. +pair_in_array(Pair, [FirstPair|Pairs]):- + pair_in_array(Pair, Pairs). + + +/** + * Question 1.3 + * les_tps(+Buddies, -Tps) + */ +les_tps(Buddies, Tps):- + combiner(Buddies, PossiblePairs), + length(Buddies, NbBuddies), + NbPairs is integer(NbBuddies / 2), + findall(Tp, extraire(PossiblePairs, NbPairs, Tp, _), Tps). diff --git a/test/test_heuristics.rb b/test/test_heuristics.rb index 0c1a07ff..a1daf2a6 100644 --- a/test/test_heuristics.rb +++ b/test/test_heuristics.rb @@ -63,6 +63,18 @@ class TestHeuristcs < Test::Unit::TestCase assert_equal Language["ECL"], results.first end + def test_pro_prolog_by_heuristics + languages = ["IDL", "Prolog"] + results = Heuristics.disambiguate_pro(fixture("Prolog/logic-problem.pro"), languages) + assert_equal Language["Prolog"], results.first + end + + def test_pro_idl_by_heuristics + languages = ["IDL", "Prolog"] + results = Heuristics.disambiguate_pro(fixture("IDL/mg_acosh.pro"), languages) + assert_equal Language["IDL"], results.first + end + def test_ts_typescript_by_heuristics languages = ["TypeScript", "XML"] results = Heuristics.disambiguate_ts(fixture("TypeScript/classes.ts"), languages)